diff --git a/ffi/Gemfile b/ffi/Gemfile index 2a76178..b06b864 100644 --- a/ffi/Gemfile +++ b/ffi/Gemfile @@ -9,6 +9,5 @@ group :development do end group :test do - gem "async-io" gem "rspec" end diff --git a/mri/Gemfile b/mri/Gemfile index 2a76178..b06b864 100644 --- a/mri/Gemfile +++ b/mri/Gemfile @@ -9,6 +9,5 @@ group :development do end group :test do - gem "async-io" gem "rspec" end diff --git a/spec/acceptance/server_spec.rb b/spec/acceptance/server_spec.rb deleted file mode 100644 index 56192dd..0000000 --- a/spec/acceptance/server_spec.rb +++ /dev/null @@ -1,32 +0,0 @@ -# frozen_string_literal: true - -require "timeout" -require "async/io" -require "llhttp" - -require_relative "support/server" - -RSpec.describe "parsing in context of a server" do - before do - @pid = Process.fork { - endpoint = Async::IO::Endpoint.tcp("0.0.0.0", 9000) - - Async do - Server.new(endpoint).run - - parser = LLHttp::Parser.new(LLHttp::Delegate.new, type: :request) - parser.parse("GET / HTTP/1.1\r\n") - end - } - end - - after do - Process.kill("HUP", @pid) - end - - it "parses" do - Timeout.timeout(1) do - expect(system("curl -v http://localhost:9000")).to be(true) - end - end -end diff --git a/spec/acceptance/support/server.rb b/spec/acceptance/support/server.rb deleted file mode 100644 index 10de381..0000000 --- a/spec/acceptance/support/server.rb +++ /dev/null @@ -1,64 +0,0 @@ -# frozen_string_literal: true - -require "async/io" -require "async/io/stream" - -class Delegate < LLHttp::Delegate - def initialize - @finished_headers = false - end - - def finished_headers? - @finished_headers == true - end - - def on_headers_complete - @finished_headers = true - end - - def reset - @finished_headers = false - end -end - -class Server - CRLF = "\r\n" - - def initialize(endpoint) - @endpoint = endpoint - @delegate = Delegate.new - @parser = LLHttp::Parser.new(@delegate, type: :request) - end - - def run - @endpoint.accept(&method(:accept)) - end - - private def accept(client, address, task:) - stream = Async::IO::Stream.new(client, sync: false) - - while parse_next(stream) - stream.write("HTTP/1.1 204 No Content\r\n") - stream.write("content-length: 0\r\n\r\n") - stream.flush - - @delegate.reset - - task.yield - end - ensure - stream.close - - @parser.reset - end - - private def parse_next(stream) - while (line = stream.read_until(CRLF, chomp: false)) - @parser << line - - if @delegate.finished_headers? - return true - end - end - end -end