Merge pull request #4231 from jekyll/pull/add-default-charset-to-webrick-cleanup-servlet
Merge pull request 4231
This commit is contained in:
		
						commit
						7f9fd11a35
					
				|  | @ -4,52 +4,55 @@ module Jekyll | |||
|   module Commands | ||||
|     class Serve | ||||
|       class Servlet < WEBrick::HTTPServlet::FileHandler | ||||
|         HEADER_DEFAULTS = {} | ||||
|         DEFAULTS = { | ||||
|           "Cache-Control" => "private, max-age=0, proxy-revalidate, " \ | ||||
|             "no-store, no-cache, must-revalidate" | ||||
|         } | ||||
| 
 | ||||
|         def initialize(server, root, callbacks) | ||||
|           extract_headers(server.config[:JekyllOptions]) | ||||
|           # So we can access them easily. | ||||
|           @jekyll_opts = server.config[:JekyllOptions] | ||||
|           set_defaults | ||||
|           super | ||||
|         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") | ||||
|         end | ||||
| 
 | ||||
|         # | ||||
| 
 | ||||
|         def do_GET(req, res) | ||||
|           res.header.merge!(@headers) if @headers.any? | ||||
|           return super | ||||
|           rtn = super | ||||
|           validate_and_ensure_charset(req, res) | ||||
|           res.header.merge!(@headers) | ||||
|           rtn | ||||
|         end | ||||
| 
 | ||||
|         # file > file/index.html > file.html > directory -> Having a directory | ||||
|         # with the same name as a file will result in the file being served the way | ||||
|         # that Nginx behaves (probably not exactly...) For browsing. | ||||
|         # | ||||
| 
 | ||||
|         def search_file(req, res, basename) | ||||
|           file = super || super(req, res, "#{basename}.html") | ||||
|         private | ||||
|         def validate_and_ensure_charset(req, res) | ||||
|           key = res.header.keys.grep(/content-type/i).first | ||||
|           typ = res.header[key] | ||||
| 
 | ||||
|           return file if file | ||||
|           file = "#{req.path.gsub(/\/\Z/, "")}.html" | ||||
|           if file && File.file?(File.join(@config[:DocumentRoot], file)) | ||||
|             return ".html" | ||||
|           end | ||||
| 
 | ||||
|           nil | ||||
|         end | ||||
| 
 | ||||
|         def extract_headers(opts) | ||||
|           @headers = add_defaults(opts.fetch("webrick", {}).fetch("headers", { | ||||
|             # Nothing. | ||||
|           })) | ||||
|         end | ||||
| 
 | ||||
|         def add_defaults(opts) | ||||
|           control_development_cache(opts) | ||||
|           HEADER_DEFAULTS.each_with_object(opts) do |(k, v), h| | ||||
|             h[k] = v if !h[k] | ||||
|           unless typ =~ /;\s*charset=/ | ||||
|             res.header[key] = "#{typ}; charset=#{@jekyll_opts["encoding"]}" | ||||
|           end | ||||
|         end | ||||
| 
 | ||||
|         def control_development_cache(opts) | ||||
|           if !opts.has_key?("Cache-Control") && Jekyll.env == "development" | ||||
|             opts["Cache-Control"] = "private, max-age=0, proxy-revalidate, no-store, no-cache, must-revalidate" | ||||
|         # | ||||
| 
 | ||||
|         private | ||||
|         def set_defaults | ||||
|           hash_ = @jekyll_opts.fetch("webrick", {}).fetch("headers", {}) | ||||
|           DEFAULTS.each_with_object(@headers = hash_) do |(key, val), hash| | ||||
|             hash[key] = val if !hash.key?(key) | ||||
|           end | ||||
|         end | ||||
|       end | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue