async-http 0.40.3 → 0.41.0

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.
Files changed (55) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +4 -4
  3. data/async-http.gemspec +3 -3
  4. data/examples/request.rb +3 -3
  5. data/examples/upload/client.rb +2 -2
  6. data/examples/upload/server.rb +3 -3
  7. data/lib/async/http.rb +1 -1
  8. data/lib/async/http/body.rb +2 -11
  9. data/lib/async/http/body/hijack.rb +3 -3
  10. data/lib/async/http/body/writable.rb +3 -2
  11. data/lib/async/http/client.rb +11 -10
  12. data/lib/async/http/{url_endpoint.rb → endpoint.rb} +1 -1
  13. data/lib/async/http/internet.rb +6 -6
  14. data/lib/async/http/pool.rb +1 -1
  15. data/lib/async/http/protocol/http1/client.rb +19 -8
  16. data/lib/async/http/protocol/http1/connection.rb +8 -25
  17. data/lib/async/http/protocol/http1/request.rb +10 -7
  18. data/lib/async/http/protocol/http1/response.rb +19 -3
  19. data/lib/async/http/protocol/http1/server.rb +14 -2
  20. data/lib/async/http/protocol/http10.rb +4 -0
  21. data/lib/async/http/protocol/http11.rb +4 -0
  22. data/lib/async/http/protocol/http2.rb +8 -0
  23. data/lib/async/http/protocol/http2/connection.rb +11 -2
  24. data/lib/async/http/protocol/http2/promise.rb +2 -2
  25. data/lib/async/http/protocol/http2/request.rb +17 -9
  26. data/lib/async/http/protocol/http2/response.rb +12 -6
  27. data/lib/async/http/protocol/http2/server.rb +12 -10
  28. data/lib/async/http/protocol/http2/stream.rb +1 -1
  29. data/lib/async/http/protocol/request.rb +6 -6
  30. data/lib/async/http/protocol/response.rb +5 -6
  31. data/lib/async/http/relative_location.rb +5 -4
  32. data/lib/async/http/server.rb +7 -5
  33. data/lib/async/http/statistics.rb +2 -2
  34. data/lib/async/http/version.rb +1 -1
  35. data/tasks/server.rake +4 -4
  36. metadata +10 -29
  37. data/lib/async/http/accept_encoding.rb +0 -65
  38. data/lib/async/http/body/buffered.rb +0 -89
  39. data/lib/async/http/body/chunked.rb +0 -76
  40. data/lib/async/http/body/deflate.rb +0 -113
  41. data/lib/async/http/body/file.rb +0 -98
  42. data/lib/async/http/body/fixed.rb +0 -72
  43. data/lib/async/http/body/inflate.rb +0 -59
  44. data/lib/async/http/body/readable.rb +0 -76
  45. data/lib/async/http/body/reader.rb +0 -83
  46. data/lib/async/http/body/remainder.rb +0 -56
  47. data/lib/async/http/body/rewindable.rb +0 -60
  48. data/lib/async/http/body/streamable.rb +0 -83
  49. data/lib/async/http/body/wrapper.rb +0 -65
  50. data/lib/async/http/content_encoding.rb +0 -76
  51. data/lib/async/http/headers.rb +0 -27
  52. data/lib/async/http/middleware.rb +0 -79
  53. data/lib/async/http/middleware/builder.rb +0 -61
  54. data/lib/async/http/request.rb +0 -71
  55. data/lib/async/http/response.rb +0 -90
@@ -1,98 +0,0 @@
1
- # Copyright, 2018, by Samuel G. D. Williams. <http://www.codeotaku.com>
2
- #
3
- # Permission is hereby granted, free of charge, to any person obtaining a copy
4
- # of this software and associated documentation files (the "Software"), to deal
5
- # in the Software without restriction, including without limitation the rights
6
- # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
- # copies of the Software, and to permit persons to whom the Software is
8
- # furnished to do so, subject to the following conditions:
9
- #
10
- # The above copyright notice and this permission notice shall be included in
11
- # all copies or substantial portions of the Software.
12
- #
13
- # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
- # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
- # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
- # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
- # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
- # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
- # THE SOFTWARE.
20
-
21
- require_relative 'readable'
22
- require 'async/io/stream'
23
-
24
- module Async
25
- module HTTP
26
- module Body
27
- class File < Readable
28
- BLOCK_SIZE = Async::IO::Stream::BLOCK_SIZE
29
- MODE = ::File::RDONLY | ::File::BINARY
30
-
31
- def self.open(path, *args)
32
- self.new(::File.open(path, MODE), *args)
33
- end
34
-
35
- def initialize(file, range = nil, block_size: BLOCK_SIZE)
36
- @file = file
37
-
38
- @block_size = block_size
39
-
40
- if range
41
- @file.seek(range.min)
42
- @offset = range.min
43
- @length = @remaining = range.size
44
- else
45
- @offset = 0
46
- @length = @remaining = @file.size
47
- end
48
- end
49
-
50
- def close(error = nil)
51
- @file.close
52
- @remaining = 0
53
-
54
- super
55
- end
56
-
57
- attr :file
58
-
59
- attr :offset
60
- attr :length
61
-
62
- def empty?
63
- @remaining == 0
64
- end
65
-
66
- def rewind
67
- @file.seek(@offset)
68
- end
69
-
70
- def read
71
- if @remaining > 0
72
- amount = [@remaining, @block_size].min
73
-
74
- if chunk = @file.read(amount)
75
- @remaining -= chunk.bytesize
76
-
77
- return chunk
78
- end
79
- end
80
- end
81
-
82
- def join
83
- return "" if @remaining == 0
84
-
85
- buffer = @file.read(@remaining)
86
-
87
- @remaining = 0
88
-
89
- return buffer
90
- end
91
-
92
- def inspect
93
- "\#<#{self.class} file=#{@file.inspect} offset=#{@offset} remaining=#{@remaining}>"
94
- end
95
- end
96
- end
97
- end
98
- end
@@ -1,72 +0,0 @@
1
- # Copyright, 2018, by Samuel G. D. Williams. <http://www.codeotaku.com>
2
- #
3
- # Permission is hereby granted, free of charge, to any person obtaining a copy
4
- # of this software and associated documentation files (the "Software"), to deal
5
- # in the Software without restriction, including without limitation the rights
6
- # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
- # copies of the Software, and to permit persons to whom the Software is
8
- # furnished to do so, subject to the following conditions:
9
- #
10
- # The above copyright notice and this permission notice shall be included in
11
- # all copies or substantial portions of the Software.
12
- #
13
- # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
- # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
- # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
- # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
- # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
- # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
- # THE SOFTWARE.
20
-
21
- require_relative 'readable'
22
-
23
- module Async
24
- module HTTP
25
- module Body
26
- class Fixed < Readable
27
- def initialize(stream, length)
28
- @stream = stream
29
- @length = length
30
- @remaining = length
31
- end
32
-
33
- attr :length
34
- attr :remaining
35
-
36
- def empty?
37
- @remaining == 0
38
- end
39
-
40
- def close(error = nil)
41
- if @remaining != 0
42
- @stream.close
43
- end
44
-
45
- super
46
- end
47
-
48
- def read
49
- if @remaining > 0
50
- if chunk = @stream.read_partial(@remaining)
51
- @remaining -= chunk.bytesize
52
-
53
- return chunk
54
- end
55
- end
56
- end
57
-
58
- def join
59
- buffer = @stream.read(@remaining)
60
-
61
- @remaining = 0
62
-
63
- return buffer
64
- end
65
-
66
- def inspect
67
- "\#<#{self.class} length=#{@length} remaining=#{@remaining}>"
68
- end
69
- end
70
- end
71
- end
72
- end
@@ -1,59 +0,0 @@
1
- # Copyright, 2018, by Samuel G. D. Williams. <http://www.codeotaku.com>
2
- #
3
- # Permission is hereby granted, free of charge, to any person obtaining a copy
4
- # of this software and associated documentation files (the "Software"), to deal
5
- # in the Software without restriction, including without limitation the rights
6
- # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
- # copies of the Software, and to permit persons to whom the Software is
8
- # furnished to do so, subject to the following conditions:
9
- #
10
- # The above copyright notice and this permission notice shall be included in
11
- # all copies or substantial portions of the Software.
12
- #
13
- # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
- # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
- # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
- # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
- # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
- # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
- # THE SOFTWARE.
20
-
21
- require 'zlib'
22
-
23
- require_relative 'deflate'
24
-
25
- module Async
26
- module HTTP
27
- module Body
28
- class Inflate < ZStream
29
- def self.for(body, encoding = GZIP)
30
- self.new(body, Zlib::Inflate.new(encoding))
31
- end
32
-
33
- def read
34
- return if @stream.finished?
35
-
36
- # The stream might have been closed while waiting for the chunk to come in.
37
- if chunk = super
38
- @input_length += chunk.bytesize
39
-
40
- # It's possible this triggers the stream to finish.
41
- chunk = @stream.inflate(chunk)
42
-
43
- @output_length += chunk.bytesize
44
- elsif !@stream.closed?
45
- chunk = @stream.finish
46
-
47
- @output_length += chunk.bytesize
48
- end
49
-
50
- if chunk.empty? and @stream.finished?
51
- return nil
52
- end
53
-
54
- return chunk
55
- end
56
- end
57
- end
58
- end
59
- end
@@ -1,76 +0,0 @@
1
- # Copyright, 2018, by Samuel G. D. Williams. <http://www.codeotaku.com>
2
- #
3
- # Permission is hereby granted, free of charge, to any person obtaining a copy
4
- # of this software and associated documentation files (the "Software"), to deal
5
- # in the Software without restriction, including without limitation the rights
6
- # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
- # copies of the Software, and to permit persons to whom the Software is
8
- # furnished to do so, subject to the following conditions:
9
- #
10
- # The above copyright notice and this permission notice shall be included in
11
- # all copies or substantial portions of the Software.
12
- #
13
- # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
- # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
- # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
- # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
- # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
- # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
- # THE SOFTWARE.
20
-
21
- require 'async/io/buffer'
22
-
23
- module Async
24
- module HTTP
25
- module Body
26
- # A generic base class for wrapping body instances. Typically you'd override `#read`.
27
- class Readable
28
- # The consumer can call stop to signal that the stream output has terminated.
29
- def close(error = nil)
30
- end
31
-
32
- # Will read return any data?
33
- def empty?
34
- false
35
- end
36
-
37
- def length
38
- nil
39
- end
40
-
41
- # Read the next available chunk.
42
- def read
43
- nil
44
- end
45
-
46
- # Read all remaining chunks into a buffered body and close the underlying input.
47
- def finish
48
- # Internally, this invokes `self.each` which then invokes `self.close`.
49
- Buffered.for(self)
50
- end
51
-
52
- # Enumerate all chunks until finished, then invoke `#close`.
53
- def each
54
- while chunk = self.read
55
- yield chunk
56
- # chunk.clear
57
- end
58
- ensure
59
- self.close($!)
60
- end
61
-
62
- # Read all remaining chunks into a single binary string using `#each`.
63
- def join
64
- buffer = IO::Buffer.new
65
-
66
- self.each do |chunk|
67
- buffer << chunk
68
- chunk.clear
69
- end
70
-
71
- return buffer
72
- end
73
- end
74
- end
75
- end
76
- end
@@ -1,83 +0,0 @@
1
- # Copyright, 2018, by Samuel G. D. Williams. <http://www.codeotaku.com>
2
- #
3
- # Permission is hereby granted, free of charge, to any person obtaining a copy
4
- # of this software and associated documentation files (the "Software"), to deal
5
- # in the Software without restriction, including without limitation the rights
6
- # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
- # copies of the Software, and to permit persons to whom the Software is
8
- # furnished to do so, subject to the following conditions:
9
- #
10
- # The above copyright notice and this permission notice shall be included in
11
- # all copies or substantial portions of the Software.
12
- #
13
- # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
- # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
- # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
- # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
- # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
- # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
- # THE SOFTWARE.
20
-
21
- module Async
22
- module HTTP
23
- module Body
24
- # General operations for interacting with a request or response body.
25
- module Reader
26
- # Read chunks from the body.
27
- # @yield [String] read chunks from the body.
28
- def each(&block)
29
- if @body
30
- @body.each(&block)
31
- @body = nil
32
- end
33
- end
34
-
35
- # Reads the entire request/response body.
36
- # @return [String] the entire body as a string.
37
- def read
38
- if @body
39
- buffer = @body.join
40
- @body = nil
41
-
42
- return buffer
43
- end
44
- end
45
-
46
- # Gracefully finish reading the body. This will buffer the remainder of the body.
47
- # @return [Buffered] buffers the entire body.
48
- def finish
49
- if @body
50
- body = @body.finish
51
- @body = nil
52
-
53
- return body
54
- end
55
- end
56
-
57
- # Write the body of the response to the given file path.
58
- def save(path, mode = ::File::WRONLY|::File::CREAT, *args)
59
- if @body
60
- ::File.open(path, mode, *args) do |file|
61
- self.each do |chunk|
62
- file.write(chunk)
63
- end
64
- end
65
- end
66
- end
67
-
68
- # Close the connection as quickly as possible. Discards body. May close the underlying connection if necessary to terminate the stream.
69
- def close(error = nil)
70
- if @body
71
- @body.close(error)
72
- @body = nil
73
- end
74
- end
75
-
76
- # Whether there is a body?
77
- def body?
78
- @body and !@body.empty?
79
- end
80
- end
81
- end
82
- end
83
- end
@@ -1,56 +0,0 @@
1
- # Copyright, 2018, by Samuel G. D. Williams. <http://www.codeotaku.com>
2
- #
3
- # Permission is hereby granted, free of charge, to any person obtaining a copy
4
- # of this software and associated documentation files (the "Software"), to deal
5
- # in the Software without restriction, including without limitation the rights
6
- # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
- # copies of the Software, and to permit persons to whom the Software is
8
- # furnished to do so, subject to the following conditions:
9
- #
10
- # The above copyright notice and this permission notice shall be included in
11
- # all copies or substantial portions of the Software.
12
- #
13
- # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
- # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
- # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
- # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
- # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
- # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
- # THE SOFTWARE.
20
-
21
- require_relative 'readable'
22
-
23
- module Async
24
- module HTTP
25
- module Body
26
- class Remainder < Readable
27
- def initialize(stream)
28
- @stream = stream
29
- end
30
-
31
- def empty?
32
- @stream.closed?
33
- end
34
-
35
- def close(error = nil)
36
- # We can't really do anything in this case except close the connection.
37
- @stream.close
38
-
39
- super
40
- end
41
-
42
- def read
43
- @stream.read_partial
44
- end
45
-
46
- def join
47
- read
48
- end
49
-
50
- def inspect
51
- "\#<#{self.class} #{@stream.closed? ? 'closed' : 'open'}>"
52
- end
53
- end
54
- end
55
- end
56
- end