async-http 0.91.0 → 0.92.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +3 -1
- data/context/getting-started.md +148 -0
- data/context/index.yaml +15 -0
- data/context/testing.md +77 -0
- data/lib/async/http/body/pipe.rb +1 -1
- data/lib/async/http/endpoint.rb +1 -3
- data/lib/async/http/middleware/location_redirector.rb +3 -4
- data/lib/async/http/protocol/http1/server.rb +1 -0
- data/lib/async/http/version.rb +1 -1
- data/lib/metrics/provider/async/http/client.rb +1 -1
- data/lib/metrics/provider/async/http/server.rb +1 -1
- data/lib/metrics/provider/async/http.rb +3 -0
- data/lib/traces/provider/async/http/client.rb +5 -0
- data/lib/traces/provider/async/http/protocol/http1/client.rb +5 -0
- data/lib/traces/provider/async/http/protocol/http2/client.rb +5 -0
- data/lib/traces/provider/async/http/server.rb +6 -1
- data/lib/traces/provider/async/http.rb +6 -1
- data/license.md +2 -0
- data/readme.md +4 -6
- data/releases.md +5 -1
- data.tar.gz.sig +0 -0
- metadata +21 -3
- metadata.gz.sig +0 -0
- data/lib/async/http/reference.rb +0 -12
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA256:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: d2eec64b9787b5fbad7b8d4b7d45566efcb701b1dcfb9aa7774bf3e2bc3f79f1
         | 
| 4 | 
            +
              data.tar.gz: 2105c3c5bb32cb5d69359bb077e4bba77bdcad644cc8186149b34c425749ccc3
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: b797e853dec72a6f115c73aa3199ae135d28f5dbaf6f2eb21ceb19bb5a747c4b3c6aadc2212a9352c86f2ea64c17a4864a829a9aea0de80fabfdef0205782df9
         | 
| 7 | 
            +
              data.tar.gz: a39431a5f5ddeedaf208121a64b232b318b73716c018de26dad6bcb1ff98cb12a3ad68e4ba11ea8b27291ee25eae1604af3f9c53152fda81cbcdab6132c709f7
         | 
    
        checksums.yaml.gz.sig
    CHANGED
    
    | @@ -1 +1,3 @@ | |
| 1 | 
            -
             | 
| 1 | 
            +
            ����+.�<�@�9ԭ�3Z���ƹ!9r*��=��,�<�No��;�1�G�C�
         | 
| 2 | 
            +
            W(T��j)5�+�ă�B�T��������*?>!�=u`��#�ƍ���7e���$%J���@�R6� Jfz��mi=�A��`�%��Y]T�my����L�P䶍�W7&�Bt����
         | 
| 3 | 
            +
            |�(��#C}���|?�ڜj 3?b��������ʃ�2q�Eo�7����Y(������h����T������,/���%��.�V&9�z�&�z�6v�B�3h�-.HT����h�'FdC��vZ�w;(���-�ٔ'�V�	O.�m��07]D�?C��Za��w�V�jI
         | 
| @@ -0,0 +1,148 @@ | |
| 1 | 
            +
            # Getting Started
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            This guide explains how to get started with `Async::HTTP`.
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            ## Installation
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            Add the gem to your project:
         | 
| 8 | 
            +
             | 
| 9 | 
            +
            ~~~ bash
         | 
| 10 | 
            +
            $ bundle add async-http
         | 
| 11 | 
            +
            ~~~
         | 
| 12 | 
            +
             | 
| 13 | 
            +
            ## Core Concepts
         | 
| 14 | 
            +
             | 
| 15 | 
            +
            - {ruby Async::HTTP::Client} is the main class for making HTTP requests.
         | 
| 16 | 
            +
            - {ruby Async::HTTP::Internet} provides a simple interface for making requests to any server "on the internet".
         | 
| 17 | 
            +
            - {ruby Async::HTTP::Server} is the main class for handling HTTP requests.
         | 
| 18 | 
            +
            - {ruby Async::HTTP::Endpoint} can parse HTTP URLs in order to create a client or server.
         | 
| 19 | 
            +
            - [`protocol-http`](https://github.com/socketry/protocol-http) provides the abstract HTTP protocol interfaces.
         | 
| 20 | 
            +
             | 
| 21 | 
            +
            ## Usage
         | 
| 22 | 
            +
             | 
| 23 | 
            +
            ### Making a Request
         | 
| 24 | 
            +
             | 
| 25 | 
            +
            To make a request, use {ruby Async::HTTP::Internet} and call the appropriate method:
         | 
| 26 | 
            +
             | 
| 27 | 
            +
            ~~~ ruby
         | 
| 28 | 
            +
            require 'async/http/internet/instance'
         | 
| 29 | 
            +
             | 
| 30 | 
            +
            Sync do
         | 
| 31 | 
            +
            	Async::HTTP::Internet.get("https://httpbin.org/get") do |response|
         | 
| 32 | 
            +
            		puts response.read
         | 
| 33 | 
            +
            	end
         | 
| 34 | 
            +
            end
         | 
| 35 | 
            +
            ~~~
         | 
| 36 | 
            +
             | 
| 37 | 
            +
            The following methods are supported:
         | 
| 38 | 
            +
             | 
| 39 | 
            +
            ~~~ ruby
         | 
| 40 | 
            +
            Async::HTTP::Internet.methods(false)
         | 
| 41 | 
            +
            # => [:patch, :options, :connect, :post, :get, :delete, :head, :trace, :put]
         | 
| 42 | 
            +
            ~~~
         | 
| 43 | 
            +
             | 
| 44 | 
            +
            Using a block will automatically close the response when the block completes. If you want to keep the response open, you can manage it manually:
         | 
| 45 | 
            +
             | 
| 46 | 
            +
            ~~~ ruby
         | 
| 47 | 
            +
            require 'async/http/internet/instance'
         | 
| 48 | 
            +
             | 
| 49 | 
            +
            Sync do
         | 
| 50 | 
            +
            	response = Async::HTTP::Internet.get("https://httpbin.org/get")
         | 
| 51 | 
            +
            	puts response.read
         | 
| 52 | 
            +
            ensure
         | 
| 53 | 
            +
            	response&.close
         | 
| 54 | 
            +
            end
         | 
| 55 | 
            +
            ~~~
         | 
| 56 | 
            +
             | 
| 57 | 
            +
            As responses are streamed, you must ensure it is closed when you are finished with it.
         | 
| 58 | 
            +
             | 
| 59 | 
            +
            #### Persistence
         | 
| 60 | 
            +
             | 
| 61 | 
            +
            By default, {ruby Async::HTTP::Internet} will create a {ruby Async::HTTP::Client} for each remote host you communicate with, and will keep those connections open for as long as possible. This is useful for reducing the latency of subsequent requests to the same host. When you exit the event loop, the connections will be closed automatically.
         | 
| 62 | 
            +
             | 
| 63 | 
            +
            ### Downloading a File
         | 
| 64 | 
            +
             | 
| 65 | 
            +
            ~~~ ruby
         | 
| 66 | 
            +
            require 'async/http/internet/instance'
         | 
| 67 | 
            +
             | 
| 68 | 
            +
            Sync do
         | 
| 69 | 
            +
            	# Issue a GET request to Google:
         | 
| 70 | 
            +
            	response = Async::HTTP::Internet.get("https://www.google.com/search?q=kittens")
         | 
| 71 | 
            +
            	
         | 
| 72 | 
            +
            	# Save the response body to a local file:
         | 
| 73 | 
            +
            	response.save("/tmp/search.html")
         | 
| 74 | 
            +
            ensure
         | 
| 75 | 
            +
            	response&.close
         | 
| 76 | 
            +
            end
         | 
| 77 | 
            +
            ~~~
         | 
| 78 | 
            +
             | 
| 79 | 
            +
            ### Posting Data
         | 
| 80 | 
            +
             | 
| 81 | 
            +
            To post data, use the `post` method:
         | 
| 82 | 
            +
             | 
| 83 | 
            +
            ~~~ ruby
         | 
| 84 | 
            +
            require 'async/http/internet/instance'
         | 
| 85 | 
            +
             | 
| 86 | 
            +
            data = {'life' => 42}
         | 
| 87 | 
            +
             | 
| 88 | 
            +
            Sync do
         | 
| 89 | 
            +
            	# Prepare the request:
         | 
| 90 | 
            +
            	headers = [['accept', 'application/json']]
         | 
| 91 | 
            +
            	body = JSON.dump(data)
         | 
| 92 | 
            +
            	
         | 
| 93 | 
            +
            	# Issues a POST request:
         | 
| 94 | 
            +
            	response = Async::HTTP::Internet.post("https://httpbin.org/anything", headers, body)
         | 
| 95 | 
            +
            	
         | 
| 96 | 
            +
            	# Save the response body to a local file:
         | 
| 97 | 
            +
            	pp JSON.parse(response.read)
         | 
| 98 | 
            +
            ensure
         | 
| 99 | 
            +
            	response&.close
         | 
| 100 | 
            +
            end
         | 
| 101 | 
            +
            ~~~
         | 
| 102 | 
            +
             | 
| 103 | 
            +
            For more complex scenarios, including HTTP APIs, consider using [async-rest](https://github.com/socketry/async-rest) instead.
         | 
| 104 | 
            +
             | 
| 105 | 
            +
            ### Timeouts
         | 
| 106 | 
            +
             | 
| 107 | 
            +
            To set a timeout for a request, use the `Task#with_timeout` method:
         | 
| 108 | 
            +
             | 
| 109 | 
            +
            ~~~ ruby
         | 
| 110 | 
            +
            require 'async/http/internet/instance'
         | 
| 111 | 
            +
             | 
| 112 | 
            +
            Sync do |task|
         | 
| 113 | 
            +
            	# Request will timeout after 2 seconds
         | 
| 114 | 
            +
            	task.with_timeout(2) do
         | 
| 115 | 
            +
            		response = Async::HTTP::Internet.get "https://httpbin.org/delay/10"
         | 
| 116 | 
            +
            	ensure
         | 
| 117 | 
            +
            		response&.close
         | 
| 118 | 
            +
            	end
         | 
| 119 | 
            +
            rescue Async::TimeoutError
         | 
| 120 | 
            +
            	puts "The request timed out"
         | 
| 121 | 
            +
            end
         | 
| 122 | 
            +
            ~~~
         | 
| 123 | 
            +
             | 
| 124 | 
            +
            ### Making a Server
         | 
| 125 | 
            +
             | 
| 126 | 
            +
            To create a server, use an instance of {ruby Async::HTTP::Server}:
         | 
| 127 | 
            +
             | 
| 128 | 
            +
            ~~~ ruby
         | 
| 129 | 
            +
            require 'async/http'
         | 
| 130 | 
            +
             | 
| 131 | 
            +
            endpoint = Async::HTTP::Endpoint.parse('http://localhost:9292')
         | 
| 132 | 
            +
             | 
| 133 | 
            +
            Sync do |task|
         | 
| 134 | 
            +
            	Async(transient: true) do
         | 
| 135 | 
            +
            		server = Async::HTTP::Server.for(endpoint) do |request|
         | 
| 136 | 
            +
            			::Protocol::HTTP::Response[200, {}, ["Hello World"]]
         | 
| 137 | 
            +
            		end
         | 
| 138 | 
            +
            		
         | 
| 139 | 
            +
            		server.run
         | 
| 140 | 
            +
            	end
         | 
| 141 | 
            +
            	
         | 
| 142 | 
            +
            	client = Async::HTTP::Client.new(endpoint)
         | 
| 143 | 
            +
            	response = client.get("/")
         | 
| 144 | 
            +
            	puts response.read
         | 
| 145 | 
            +
            ensure
         | 
| 146 | 
            +
            	response&.close
         | 
| 147 | 
            +
            end
         | 
| 148 | 
            +
            ~~~
         | 
    
        data/context/index.yaml
    ADDED
    
    | @@ -0,0 +1,15 @@ | |
| 1 | 
            +
            # Automatically generated context index for Utopia::Project guides.
         | 
| 2 | 
            +
            # Do not edit then files in this directory directly, instead edit the guides and then run `bake utopia:project:agent:context:update`.
         | 
| 3 | 
            +
            ---
         | 
| 4 | 
            +
            description: A HTTP client and server library.
         | 
| 5 | 
            +
            metadata:
         | 
| 6 | 
            +
              documentation_uri: https://socketry.github.io/async-http/
         | 
| 7 | 
            +
              source_code_uri: https://github.com/socketry/async-http.git
         | 
| 8 | 
            +
            files:
         | 
| 9 | 
            +
            - path: getting-started.md
         | 
| 10 | 
            +
              title: Getting Started
         | 
| 11 | 
            +
              description: This guide explains how to get started with `Async::HTTP`.
         | 
| 12 | 
            +
            - path: testing.md
         | 
| 13 | 
            +
              title: Testing
         | 
| 14 | 
            +
              description: This guide explains how to use `Async::HTTP` clients and servers in
         | 
| 15 | 
            +
                your tests.
         | 
    
        data/context/testing.md
    ADDED
    
    | @@ -0,0 +1,77 @@ | |
| 1 | 
            +
            # Testing
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            This guide explains how to use `Async::HTTP` clients and servers in your tests.
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            In general, you should avoid making real HTTP requests in your tests. Instead, you should use a mock server or a fake client.
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            ## Mocking HTTP Responses
         | 
| 8 | 
            +
             | 
| 9 | 
            +
            The mocking feature of `Async::HTTP` uses a real server running in a separate task, and routes all requests to it. This allows you to intercept requests and return custom responses, but still use the real HTTP client.
         | 
| 10 | 
            +
             | 
| 11 | 
            +
            In order to enable this feature, you must create an instance of {ruby Async::HTTP::Mock::Endpoint} which will handle the requests.
         | 
| 12 | 
            +
             | 
| 13 | 
            +
            ~~~ ruby
         | 
| 14 | 
            +
            require 'async/http'
         | 
| 15 | 
            +
            require 'async/http/mock'
         | 
| 16 | 
            +
             | 
| 17 | 
            +
            mock_endpoint = Async::HTTP::Mock::Endpoint.new
         | 
| 18 | 
            +
             | 
| 19 | 
            +
            Sync do
         | 
| 20 | 
            +
            	# Start a background server:
         | 
| 21 | 
            +
            	server_task = Async(transient: true) do
         | 
| 22 | 
            +
            		mock_endpoint.run do |request|
         | 
| 23 | 
            +
            			# Respond to the request:
         | 
| 24 | 
            +
            			::Protocol::HTTP::Response[200, {}, ["Hello, World"]]
         | 
| 25 | 
            +
            		end
         | 
| 26 | 
            +
            	end
         | 
| 27 | 
            +
            	
         | 
| 28 | 
            +
            	endpoint = Async::HTTP::Endpoint.parse("https://www.google.com")
         | 
| 29 | 
            +
            	mocked_endpoint = mock_endpoint.wrap(endpoint)
         | 
| 30 | 
            +
            	client = Async::HTTP::Client.new(mocked_endpoint)
         | 
| 31 | 
            +
            	
         | 
| 32 | 
            +
            	response = client.get("/")
         | 
| 33 | 
            +
            	puts response.read
         | 
| 34 | 
            +
            	# => "Hello, World"
         | 
| 35 | 
            +
            end
         | 
| 36 | 
            +
            ~~~
         | 
| 37 | 
            +
             | 
| 38 | 
            +
            ## Transparent Mocking
         | 
| 39 | 
            +
             | 
| 40 | 
            +
            Using your test framework's mocking capabilities, you can easily replace the `Async::HTTP::Client#new` with a method that returns a client with a mocked endpoint.
         | 
| 41 | 
            +
             | 
| 42 | 
            +
            ### Sus Integration
         | 
| 43 | 
            +
             | 
| 44 | 
            +
            ~~~ ruby
         | 
| 45 | 
            +
            require 'async/http'
         | 
| 46 | 
            +
            require 'async/http/mock'
         | 
| 47 | 
            +
            require 'sus/fixtures/async/reactor_context'
         | 
| 48 | 
            +
             | 
| 49 | 
            +
            include Sus::Fixtures::Async::ReactorContext
         | 
| 50 | 
            +
             | 
| 51 | 
            +
            let(:mock_endpoint) {Async::HTTP::Mock::Endpoint.new}
         | 
| 52 | 
            +
             | 
| 53 | 
            +
            def before
         | 
| 54 | 
            +
            	super
         | 
| 55 | 
            +
            	
         | 
| 56 | 
            +
            	# Mock the HTTP client:
         | 
| 57 | 
            +
            	mock(Async::HTTP::Client) do |mock|
         | 
| 58 | 
            +
            		mock.wrap(:new) do |original, endpoint|
         | 
| 59 | 
            +
            			original.call(mock_endpoint.wrap(endpoint))
         | 
| 60 | 
            +
            		end
         | 
| 61 | 
            +
            	end
         | 
| 62 | 
            +
            	
         | 
| 63 | 
            +
            	# Run the mock server:
         | 
| 64 | 
            +
            	Async(transient: true) do
         | 
| 65 | 
            +
            		mock_endpoint.run do |request|
         | 
| 66 | 
            +
            			::Protocol::HTTP::Response[200, {}, ["Hello, World"]]
         | 
| 67 | 
            +
            		end
         | 
| 68 | 
            +
            	end
         | 
| 69 | 
            +
            end
         | 
| 70 | 
            +
             | 
| 71 | 
            +
            it "should perform a web request" do
         | 
| 72 | 
            +
            	client = Async::HTTP::Client.new(Async::HTTP::Endpoint.parse("https://www.google.com"))
         | 
| 73 | 
            +
            	response = client.get("/")
         | 
| 74 | 
            +
            	# The response is mocked:
         | 
| 75 | 
            +
            	expect(response.read).to be == "Hello, World"
         | 
| 76 | 
            +
            end
         | 
| 77 | 
            +
            ~~~
         | 
    
        data/lib/async/http/body/pipe.rb
    CHANGED
    
    
    
        data/lib/async/http/endpoint.rb
    CHANGED
    
    | @@ -6,6 +6,7 @@ | |
| 6 6 | 
             
            # Copyright, 2024, by Thomas Morgan.
         | 
| 7 7 | 
             
            # Copyright, 2024, by Igor Sidorov.
         | 
| 8 8 | 
             
            # Copyright, 2024, by Hal Brodigan.
         | 
| 9 | 
            +
            # Copyright, 2025, by William T. Nelson.
         | 
| 9 10 |  | 
| 10 11 | 
             
            require "io/endpoint"
         | 
| 11 12 | 
             
            require "io/endpoint/host_endpoint"
         | 
| @@ -16,9 +17,6 @@ require_relative "protocol/https" | |
| 16 17 |  | 
| 17 18 | 
             
            require "uri"
         | 
| 18 19 |  | 
| 19 | 
            -
            # Compatibility with Ruby 3.1.2
         | 
| 20 | 
            -
            require "uri/wss"
         | 
| 21 | 
            -
             | 
| 22 20 | 
             
            module Async
         | 
| 23 21 | 
             
            	module HTTP
         | 
| 24 22 | 
             
            		# Represents a way to connect to a remote HTTP server.
         | 
| @@ -1,12 +1,11 @@ | |
| 1 1 | 
             
            # frozen_string_literal: true
         | 
| 2 2 |  | 
| 3 3 | 
             
            # Released under the MIT License.
         | 
| 4 | 
            -
            # Copyright, 2024, by Samuel Williams.
         | 
| 5 | 
            -
             | 
| 6 | 
            -
            require_relative "../reference"
         | 
| 4 | 
            +
            # Copyright, 2024-2025, by Samuel Williams.
         | 
| 7 5 |  | 
| 8 6 | 
             
            require "protocol/http/middleware"
         | 
| 9 7 | 
             
            require "protocol/http/body/rewindable"
         | 
| 8 | 
            +
            require "protocol/url/reference"
         | 
| 10 9 |  | 
| 11 10 | 
             
            module Async
         | 
| 12 11 | 
             
            	module HTTP
         | 
| @@ -71,7 +70,7 @@ module Async | |
| 71 70 | 
             
            					end
         | 
| 72 71 |  | 
| 73 72 | 
             
            					# Update the path of the request:
         | 
| 74 | 
            -
            					request.path = Reference[request.path] + location
         | 
| 73 | 
            +
            					request.path = ::Protocol::URL::Reference[request.path] + location
         | 
| 75 74 |  | 
| 76 75 | 
             
            					# Follow the redirect:
         | 
| 77 76 | 
             
            					return true
         | 
    
        data/lib/async/http/version.rb
    CHANGED
    
    
| @@ -9,7 +9,7 @@ require "metrics/provider" | |
| 9 9 | 
             
            Metrics::Provider(Async::HTTP::Client) do
         | 
| 10 10 | 
             
            	ASYNC_HTTP_CLIENT_REQUEST_INITIATED = Metrics.metric("async.http.client.request.initiated", :counter, description: "The number of HTTP client requests initiated.")
         | 
| 11 11 | 
             
            	ASYNC_HTTP_CLIENT_REQUEST_FINISHED = Metrics.metric("async.http.client.request.finished", :counter, description: "The number of HTTP client requests finished.")
         | 
| 12 | 
            -
             | 
| 12 | 
            +
            	
         | 
| 13 13 | 
             
            	def make_response(request, connection, attempt)
         | 
| 14 14 | 
             
            		ASYNC_HTTP_CLIENT_REQUEST_INITIATED.emit(1, tags: ["method:#{request.method}"])
         | 
| 15 15 |  | 
| @@ -9,7 +9,7 @@ require "metrics/provider" | |
| 9 9 | 
             
            Metrics::Provider(Async::HTTP::Server) do
         | 
| 10 10 | 
             
            	ASYNC_HTTP_SERVER_REQUEST_INITIATED = Metrics.metric("async.http.server.request.initiated", :counter, description: "The number of HTTP server requests initiated.")
         | 
| 11 11 | 
             
            	ASYNC_HTTP_SERVER_REQUEST_FINISHED = Metrics.metric("async.http.server.request.finished", :counter, description: "The number of HTTP server requests finished.")
         | 
| 12 | 
            -
             | 
| 12 | 
            +
            	
         | 
| 13 13 | 
             
            	def call(request)
         | 
| 14 14 | 
             
            		ASYNC_HTTP_SERVER_REQUEST_INITIATED.emit(1, tags: ["method:#{request.method}"])
         | 
| 15 15 |  | 
| @@ -1,3 +1,8 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            # Released under the MIT License.
         | 
| 4 | 
            +
            # Copyright, 2025, by Samuel Williams.
         | 
| 5 | 
            +
             | 
| 1 6 | 
             
            require_relative "../../../../async/http/server"
         | 
| 2 7 |  | 
| 3 8 | 
             
            Traces::Provider(Async::HTTP::Server) do
         | 
| @@ -35,4 +40,4 @@ Traces::Provider(Async::HTTP::Server) do | |
| 35 40 | 
             
            			end
         | 
| 36 41 | 
             
            		end
         | 
| 37 42 | 
             
            	end
         | 
| 38 | 
            -
            end
         | 
| 43 | 
            +
            end
         | 
    
        data/license.md
    CHANGED
    
    | @@ -23,6 +23,8 @@ Copyright, 2023, by Josh Huber. | |
| 23 23 | 
             
            Copyright, 2024, by Anton Zhuravsky.  
         | 
| 24 24 | 
             
            Copyright, 2024, by Hal Brodigan.  
         | 
| 25 25 | 
             
            Copyright, 2025, by Jean Boussier.  
         | 
| 26 | 
            +
            Copyright, 2025, by Yuuji Yaginuma.  
         | 
| 27 | 
            +
            Copyright, 2025, by William T. Nelson.  
         | 
| 26 28 |  | 
| 27 29 | 
             
            Permission is hereby granted, free of charge, to any person obtaining a copy
         | 
| 28 30 | 
             
            of this software and associated documentation files (the "Software"), to deal
         | 
    
        data/readme.md
    CHANGED
    
    | @@ -16,6 +16,10 @@ Please see the [project documentation](https://socketry.github.io/async-http/) f | |
| 16 16 |  | 
| 17 17 | 
             
            Please see the [project releases](https://socketry.github.io/async-http/releases/index) for all releases.
         | 
| 18 18 |  | 
| 19 | 
            +
            ### v0.92.0
         | 
| 20 | 
            +
             | 
| 21 | 
            +
              - **Breaking**: Remove `Async::HTTP::Reference`. Use `Protocol::URL::Reference` directly instead.
         | 
| 22 | 
            +
             | 
| 19 23 | 
             
            ### v0.91.0
         | 
| 20 24 |  | 
| 21 25 | 
             
              - Move all default trace providers into `traces/provider/async/http`.
         | 
| @@ -53,12 +57,6 @@ Please see the [project releases](https://socketry.github.io/async-http/releases | |
| 53 57 | 
             
              - Improved HTTP/1 connection handling.
         | 
| 54 58 | 
             
              - The input stream is no longer closed when the output stream is closed.
         | 
| 55 59 |  | 
| 56 | 
            -
            ### v0.76.0
         | 
| 57 | 
            -
             | 
| 58 | 
            -
              - `Async::HTTP::Body::Writable` is moved to `Protocol::HTTP::Body::Writable`.
         | 
| 59 | 
            -
              - Remove `Async::HTTP::Body::Delayed` with no replacement.
         | 
| 60 | 
            -
              - Remove `Async::HTTP::Body::Slowloris` with no replacement.
         | 
| 61 | 
            -
             | 
| 62 60 | 
             
            ## See Also
         | 
| 63 61 |  | 
| 64 62 | 
             
              - [benchmark-http](https://github.com/socketry/benchmark-http) — A benchmarking tool to report on web server concurrency.
         | 
    
        data/releases.md
    CHANGED
    
    | @@ -1,5 +1,9 @@ | |
| 1 1 | 
             
            # Releases
         | 
| 2 2 |  | 
| 3 | 
            +
            ## v0.92.0
         | 
| 4 | 
            +
             | 
| 5 | 
            +
              - **Breaking**: Remove `Async::HTTP::Reference`. Use `Protocol::URL::Reference` directly instead.
         | 
| 6 | 
            +
             | 
| 3 7 | 
             
            ## v0.91.0
         | 
| 4 8 |  | 
| 5 9 | 
             
              - Move all default trace providers into `traces/provider/async/http`.
         | 
| @@ -145,7 +149,7 @@ internet.get("https://example.com", scheme: "http") | |
| 145 149 | 
             
            ``` ruby
         | 
| 146 150 | 
             
            # Server side:
         | 
| 147 151 | 
             
            def call(request)
         | 
| 148 | 
            -
            	if request.headers[ | 
| 152 | 
            +
            	if request.headers["expect"].include?("100-continue")
         | 
| 149 153 | 
             
            		request.send_interim_response(100)
         | 
| 150 154 | 
             
            	end
         | 
| 151 155 |  | 
    
        data.tar.gz.sig
    CHANGED
    
    | Binary file | 
    
        metadata
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: async-http
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0. | 
| 4 | 
            +
              version: 0.92.1
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Samuel Williams
         | 
| @@ -11,6 +11,7 @@ authors: | |
| 11 11 | 
             
            - Thomas Morgan
         | 
| 12 12 | 
             
            - Adam Daniels
         | 
| 13 13 | 
             
            - Igor Sidorov
         | 
| 14 | 
            +
            - William T. Nelson
         | 
| 14 15 | 
             
            - Anton Zhuravsky
         | 
| 15 16 | 
             
            - Cyril Roelandt
         | 
| 16 17 | 
             
            - Denis Talakevich
         | 
| @@ -26,6 +27,7 @@ authors: | |
| 26 27 | 
             
            - Tim Meusel
         | 
| 27 28 | 
             
            - Trevor Turk
         | 
| 28 29 | 
             
            - Viacheslav Koval
         | 
| 30 | 
            +
            - Yuuji Yaginuma
         | 
| 29 31 | 
             
            - dependabot[bot]
         | 
| 30 32 | 
             
            bindir: bin
         | 
| 31 33 | 
             
            cert_chain:
         | 
| @@ -172,6 +174,20 @@ dependencies: | |
| 172 174 | 
             
                - - "~>"
         | 
| 173 175 | 
             
                  - !ruby/object:Gem::Version
         | 
| 174 176 | 
             
                    version: '0.22'
         | 
| 177 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 178 | 
            +
              name: protocol-url
         | 
| 179 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 180 | 
            +
                requirements:
         | 
| 181 | 
            +
                - - "~>"
         | 
| 182 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 183 | 
            +
                    version: '0.2'
         | 
| 184 | 
            +
              type: :runtime
         | 
| 185 | 
            +
              prerelease: false
         | 
| 186 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 187 | 
            +
                requirements:
         | 
| 188 | 
            +
                - - "~>"
         | 
| 189 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 190 | 
            +
                    version: '0.2'
         | 
| 175 191 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 176 192 | 
             
              name: traces
         | 
| 177 193 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| @@ -192,6 +208,9 @@ extra_rdoc_files: [] | |
| 192 208 | 
             
            files:
         | 
| 193 209 | 
             
            - bake/async/http.rb
         | 
| 194 210 | 
             
            - bake/async/http/h2spec.rb
         | 
| 211 | 
            +
            - context/getting-started.md
         | 
| 212 | 
            +
            - context/index.yaml
         | 
| 213 | 
            +
            - context/testing.md
         | 
| 195 214 | 
             
            - lib/async/http.rb
         | 
| 196 215 | 
             
            - lib/async/http/body.rb
         | 
| 197 216 | 
             
            - lib/async/http/body/hijack.rb
         | 
| @@ -230,7 +249,6 @@ files: | |
| 230 249 | 
             
            - lib/async/http/protocol/request.rb
         | 
| 231 250 | 
             
            - lib/async/http/protocol/response.rb
         | 
| 232 251 | 
             
            - lib/async/http/proxy.rb
         | 
| 233 | 
            -
            - lib/async/http/reference.rb
         | 
| 234 252 | 
             
            - lib/async/http/relative_location.rb
         | 
| 235 253 | 
             
            - lib/async/http/server.rb
         | 
| 236 254 | 
             
            - lib/async/http/statistics.rb
         | 
| @@ -266,7 +284,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement | |
| 266 284 | 
             
                - !ruby/object:Gem::Version
         | 
| 267 285 | 
             
                  version: '0'
         | 
| 268 286 | 
             
            requirements: []
         | 
| 269 | 
            -
            rubygems_version: 3. | 
| 287 | 
            +
            rubygems_version: 3.7.2
         | 
| 270 288 | 
             
            specification_version: 4
         | 
| 271 289 | 
             
            summary: A HTTP client and server library.
         | 
| 272 290 | 
             
            test_files: []
         | 
    
        metadata.gz.sig
    CHANGED
    
    | Binary file | 
    
        data/lib/async/http/reference.rb
    DELETED