Sha256: d9e733340399f28ba27c0d5304bf4fcfc4741e4941fe298953d2452bcbd19d5e

Contents?: true

Size: 1.94 KB

Versions: 49

Compression:

Stored size: 1.94 KB

Contents

# frozen_string_literal: true

require "webrick"

module Bridgetown
  module Commands
    class Serve
      class Servlet < WEBrick::HTTPServlet::FileHandler
        DEFAULTS = {
          "Cache-Control" => "private, max-age=0, proxy-revalidate, " \
            "no-store, no-cache, must-revalidate",
        }.freeze

        def initialize(server, root, callbacks)
          # So we can access them easily.
          @bridgetown_opts = server.config[:BridgetownOptions]
          set_defaults
          super
        end

        def search_index_file(req, res)
          super ||
            search_file(req, res, ".html") ||
            search_file(req, res, ".xhtml")
        end

        # Add the ability to tap file.html the same way that Nginx does on our
        # Docker images (or on GitHub Pages.) The difference is that we might end
        # up with a different preference on which comes first.

        def search_file(req, res, basename)
          # /file.* > /file/index.html > /file.html
          super ||
            super(req, res, "#{basename}.html") ||
            super(req, res, "#{basename}.xhtml")
        end

        # rubocop:disable Naming/MethodName
        def do_GET(req, res)
          rtn = super

          validate_and_ensure_charset(req, res)
          res.header.merge!(@headers)
          rtn
        end
        # rubocop:enable Naming/MethodName

        private

        def validate_and_ensure_charset(_req, res)
          key = res.header.keys.grep(%r!content-type!i).first
          typ = res.header[key]

          unless %r!;\s*charset=!.match?(typ)
            res.header[key] = "#{typ}; charset=#{@bridgetown_opts["encoding"]}"
          end
        end

        def set_defaults
          hash_ = @bridgetown_opts.fetch("webrick", {}).fetch("headers", {})
          DEFAULTS.each_with_object(@headers = hash_) do |(key, val), hash|
            hash[key] = val unless hash.key?(key)
          end
        end
      end
    end
  end
end

Version data entries

49 entries across 49 versions & 1 rubygems

Version Path
bridgetown-core-0.21.5 lib/bridgetown-core/commands/serve/servlet.rb
bridgetown-core-1.0.0.alpha1 lib/bridgetown-core/commands/serve/servlet.rb
bridgetown-core-0.21.4 lib/bridgetown-core/commands/serve/servlet.rb
bridgetown-core-0.21.3 lib/bridgetown-core/commands/serve/servlet.rb
bridgetown-core-0.21.2 lib/bridgetown-core/commands/serve/servlet.rb
bridgetown-core-0.21.1 lib/bridgetown-core/commands/serve/servlet.rb
bridgetown-core-0.21.0 lib/bridgetown-core/commands/serve/servlet.rb
bridgetown-core-0.21.0.beta4 lib/bridgetown-core/commands/serve/servlet.rb
bridgetown-core-0.21.0.beta3 lib/bridgetown-core/commands/serve/servlet.rb
bridgetown-core-0.21.0.beta2 lib/bridgetown-core/commands/serve/servlet.rb
bridgetown-core-0.21.0.beta1 lib/bridgetown-core/commands/serve/servlet.rb
bridgetown-core-0.20.0 lib/bridgetown-core/commands/serve/servlet.rb
bridgetown-core-0.19.3 lib/bridgetown-core/commands/serve/servlet.rb
bridgetown-core-0.19.2 lib/bridgetown-core/commands/serve/servlet.rb
bridgetown-core-0.19.1 lib/bridgetown-core/commands/serve/servlet.rb
bridgetown-core-0.19.0 lib/bridgetown-core/commands/serve/servlet.rb
bridgetown-core-0.18.6 lib/bridgetown-core/commands/serve/servlet.rb
bridgetown-core-0.18.5 lib/bridgetown-core/commands/serve/servlet.rb
bridgetown-core-0.18.4 lib/bridgetown-core/commands/serve/servlet.rb
bridgetown-core-0.18.3 lib/bridgetown-core/commands/serve/servlet.rb