diff --git a/packages/ruby/server/lib/server.rb b/packages/ruby/server/lib/server.rb index 812ad18ea..7fc34a72f 100644 --- a/packages/ruby/server/lib/server.rb +++ b/packages/ruby/server/lib/server.rb @@ -4,10 +4,12 @@ class Server require "rack" require_relative "server/puma" require_relative "server/gzip" + require_relative "server/etag" require_relative "server/dir" def self.app(path) Rack::Builder.app do + use Server::ETag run Server::Dir.new(path) end end diff --git a/packages/ruby/server/lib/server/dir.rb b/packages/ruby/server/lib/server/dir.rb index 0cacd0a44..2527422f7 100644 --- a/packages/ruby/server/lib/server/dir.rb +++ b/packages/ruby/server/lib/server/dir.rb @@ -32,7 +32,7 @@ class Server::Dir 200, {"content-type" => mime_types[extn] || Rack::Mime.mime_type(extn), "content-length" => body.bytesize}, - body.each_line + body.each_line.to_a ] end diff --git a/packages/ruby/server/lib/server/etag.rb b/packages/ruby/server/lib/server/etag.rb new file mode 100644 index 000000000..cd731b3d8 --- /dev/null +++ b/packages/ruby/server/lib/server/etag.rb @@ -0,0 +1,16 @@ +# frozen_string_literal: true + +class Server::ETag < Rack::ETag + def initialize(app) + @app = app + end + + def call(env) + status, headers, body = super(env) + if env["HTTP_IF_NONE_MATCH"] == headers["etag"] + [304, headers, [""]] + else + [status, headers, body] + end + end +end