async-http 0.30.4 → 0.31.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,36 @@
1
+ # Copyright, 2017, 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 'http/protocol/http11/connection'
22
+
23
+ require_relative '../http1/connection'
24
+ require_relative '../http1/client'
25
+
26
+ module Async
27
+ module HTTP
28
+ module Protocol
29
+ module HTTP11
30
+ class Client < ::HTTP::Protocol::HTTP11::Connection
31
+ include HTTP1::Connection, HTTP1::Client
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,36 @@
1
+ # Copyright, 2017, 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 'http/protocol/http11/connection'
22
+
23
+ require_relative '../http1/connection'
24
+ require_relative '../http1/server'
25
+
26
+ module Async
27
+ module HTTP
28
+ module Protocol
29
+ module HTTP11
30
+ class Server < ::HTTP::Protocol::HTTP11::Connection
31
+ include HTTP1::Connection, HTTP1::Server
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -34,6 +34,7 @@ module Async
34
34
  @stream = stream
35
35
 
36
36
  framer = ::HTTP::Protocol::HTTP2::Framer.new(@stream)
37
+
37
38
  super(framer, *args)
38
39
  end
39
40
 
@@ -79,7 +79,7 @@ module Async
79
79
  end
80
80
 
81
81
  # Can we use this connection to make requests?
82
- def good?
82
+ def connected?
83
83
  @stream.connected?
84
84
  end
85
85
 
@@ -91,7 +91,7 @@ module Async
91
91
  ])
92
92
 
93
93
  if length = response.body.length
94
- headers << [[CONTENT_LENGTH, length]]
94
+ headers << [[::HTTP::Protocol::CONTENT_LENGTH, length]]
95
95
  end
96
96
 
97
97
  headers << response.headers
@@ -34,6 +34,7 @@ module Async
34
34
  @stream = stream
35
35
 
36
36
  framer = ::HTTP::Protocol::HTTP2::Framer.new(stream)
37
+
37
38
  super(framer, *args)
38
39
 
39
40
  @requests = Async::Queue.new
@@ -53,7 +54,7 @@ module Async
53
54
  @requests.enqueue nil
54
55
  end
55
56
 
56
- def receive_requests
57
+ def each
57
58
  while request = @requests.dequeue
58
59
  @count += 1
59
60
 
@@ -1,4 +1,4 @@
1
- # Copyright, 2018, by Samuel G. D. Williams. <http://www.codeotaku.com>
1
+ # Copyright, 2017, by Samuel G. D. Williams. <http://www.codeotaku.com>
2
2
  #
3
3
  # Permission is hereby granted, free of charge, to any person obtaining a copy
4
4
  # of this software and associated documentation files (the "Software"), to deal
@@ -18,171 +18,10 @@
18
18
  # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
19
  # THE SOFTWARE.
20
20
 
21
+ require 'http/protocol/reference'
22
+
21
23
  module Async
22
24
  module HTTP
23
- # A relative reference, excluding any authority.
24
- class Reference
25
- def initialize(path, query_string, fragment, parameters)
26
- @path = path
27
- @query_string = query_string
28
- @fragment = fragment
29
- @parameters = parameters
30
- end
31
-
32
- def self.[] reference
33
- if reference.is_a? self
34
- return reference
35
- else
36
- return self.parse(reference)
37
- end
38
- end
39
-
40
- # Generate a reference from a path and user parameters. The path may contain a `#fragment` or `?query=parameters`.
41
- def self.parse(path = '/', parameters = nil)
42
- base, fragment = path.split('#', 2)
43
- path, query_string = base.split('?', 2)
44
-
45
- self.new(path, query_string, fragment, parameters)
46
- end
47
-
48
- # The path component, e.g. /foo/bar/index.html
49
- attr :path
50
-
51
- # The un-parsed query string, e.g. 'x=10&y=20'
52
- attr :query_string
53
-
54
- # A fragment, the part after the '#'
55
- attr :fragment
56
-
57
- # User supplied parameters that will be appended to the query part.
58
- attr :parameters
59
-
60
- def parameters?
61
- @parameters and !@parameters.empty?
62
- end
63
-
64
- def query_string?
65
- @query_string and !@query_string.empty?
66
- end
67
-
68
- def fragment?
69
- @fragment and !@fragment.empty?
70
- end
71
-
72
- def append(buffer)
73
- if query_string?
74
- buffer << escape_path(@path) << '?' << @query_string
75
- buffer << '&' << encode(@parameters) if parameters?
76
- else
77
- buffer << escape_path(@path)
78
- buffer << '?' << encode(@parameters) if parameters?
79
- end
80
-
81
- if fragment?
82
- buffer << '#' << escape(@fragment)
83
- end
84
-
85
- return buffer
86
- end
87
-
88
- def to_str
89
- append(String.new)
90
- end
91
-
92
- alias to_s to_str
93
-
94
- def + other
95
- other = self.class[other]
96
-
97
- self.class.new(
98
- expand_path(self.path, other.path),
99
- other.query_string,
100
- other.fragment,
101
- other.parameters,
102
- )
103
- end
104
-
105
- def [] parameters
106
- self.dup(nil, parameters)
107
- end
108
-
109
- def dup(path = nil, parameters = nil)
110
- if @parameters
111
- if parameters
112
- parameters = @parameters.merge(parameters)
113
- else
114
- parameters = @parameters
115
- end
116
- end
117
-
118
- if path
119
- path = @path + '/' + path
120
- else
121
- path = @path
122
- end
123
-
124
- self.class.new(path, @query_string, @fragment, parameters)
125
- end
126
-
127
- private
128
-
129
- def expand_path(base, relative)
130
- if relative.start_with? '/'
131
- return relative
132
- else
133
- path = base.split('/')
134
- parts = relative.split('/')
135
-
136
- parts.each do |part|
137
- if part == '..'
138
- path.pop
139
- else
140
- path << part
141
- end
142
- end
143
-
144
- return path.join('/')
145
- end
146
- end
147
-
148
- # Escapes a generic string, using percent encoding.
149
- def escape(string)
150
- encoding = string.encoding
151
- string.b.gsub(/([^a-zA-Z0-9_.\-]+)/) do |m|
152
- '%' + m.unpack('H2' * m.bytesize).join('%').upcase
153
- end.force_encoding(encoding)
154
- end
155
-
156
- # According to https://tools.ietf.org/html/rfc3986#section-3.3, we escape non-pchar.
157
- NON_PCHAR = /([^a-zA-Z0-9_\-\.~!$&'()*+,;=:@\/]+)/.freeze
158
-
159
- # Escapes a path
160
- def escape_path(path)
161
- encoding = path.encoding
162
- path.b.gsub(NON_PCHAR) do |m|
163
- '%' + m.unpack('H2' * m.bytesize).join('%').upcase
164
- end.force_encoding(encoding)
165
- end
166
-
167
- # Encodes a hash or array into a query string
168
- def encode(value, prefix = nil)
169
- case value
170
- when Array
171
- return value.map {|v|
172
- encode(v, "#{prefix}[]")
173
- }.join("&")
174
- when Hash
175
- return value.map {|k, v|
176
- encode(v, prefix ? "#{prefix}[#{escape(k.to_s)}]" : escape(k.to_s))
177
- }.reject(&:empty?).join('&')
178
- when nil
179
- return prefix
180
- else
181
- raise ArgumentError, "value must be a Hash" if prefix.nil?
182
-
183
- return "#{prefix}=#{escape(value.to_s)}"
184
- end
185
- end
186
- end
25
+ Reference = ::HTTP::Protocol::Reference
187
26
  end
188
27
  end
@@ -23,7 +23,6 @@ require 'async/io/endpoint'
23
23
  require_relative 'protocol'
24
24
  require_relative 'response'
25
25
 
26
-
27
26
  module Async
28
27
  module HTTP
29
28
  class Server < Middleware
@@ -46,7 +45,7 @@ module Async
46
45
 
47
46
  Async.logger.debug(self) {"Incoming connnection from #{address.inspect} to #{protocol}"}
48
47
 
49
- protocol.receive_requests do |request|
48
+ protocol.each do |request|
50
49
  request.remote_address = address
51
50
  # Async.logger.debug(self) {"Incoming request from #{address.inspect}: #{request.method} #{request.path}"}
52
51
 
@@ -20,6 +20,6 @@
20
20
 
21
21
  module Async
22
22
  module HTTP
23
- VERSION = "0.30.4"
23
+ VERSION = "0.31.1"
24
24
  end
25
25
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: async-http
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.30.4
4
+ version: 0.31.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Samuel Williams
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-08-21 00:00:00.000000000 Z
11
+ date: 2018-09-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: async
@@ -30,28 +30,28 @@ dependencies:
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '1.15'
33
+ version: '1.16'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '1.15'
40
+ version: '1.16'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: http-protocol
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: 0.3.0
47
+ version: 0.5.0
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: 0.3.0
54
+ version: 0.5.0
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: async-rspec
57
57
  requirement: !ruby/object:Gem::Requirement
@@ -159,8 +159,17 @@ files:
159
159
  - lib/async/http/pool.rb
160
160
  - lib/async/http/protocol.rb
161
161
  - lib/async/http/protocol/http1.rb
162
+ - lib/async/http/protocol/http1/client.rb
163
+ - lib/async/http/protocol/http1/connection.rb
164
+ - lib/async/http/protocol/http1/request.rb
165
+ - lib/async/http/protocol/http1/response.rb
166
+ - lib/async/http/protocol/http1/server.rb
162
167
  - lib/async/http/protocol/http10.rb
168
+ - lib/async/http/protocol/http10/client.rb
169
+ - lib/async/http/protocol/http10/server.rb
163
170
  - lib/async/http/protocol/http11.rb
171
+ - lib/async/http/protocol/http11/client.rb
172
+ - lib/async/http/protocol/http11/server.rb
164
173
  - lib/async/http/protocol/http2.rb
165
174
  - lib/async/http/protocol/http2/client.rb
166
175
  - lib/async/http/protocol/http2/connection.rb
@@ -198,7 +207,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
198
207
  version: '0'
199
208
  requirements: []
200
209
  rubyforge_project:
201
- rubygems_version: 2.7.6
210
+ rubygems_version: 2.7.7
202
211
  signing_key:
203
212
  specification_version: 4
204
213
  summary: A HTTP client and server library.