http-protocol 0.5.0 → 0.6.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.
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9327c9adf284058c58e7e426b736ff72e3752fecd81197fe6b924a1c6df5c283
|
4
|
+
data.tar.gz: a34c59791a0aaa73fa92ac2414142ce3b0fc8fcb0eeaffc681b470dd81a239ee
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: eaac214ab838e2e1a96a86ccd4756af6a7213b79157f738c43cbdaf2754e36b2dd08e04da675d49cd3f1d199db5bcfa9e468381e48ac8155508b920ef48e3e88
|
7
|
+
data.tar.gz: 8f1dc78539df7034795ba5d407213d3905f354878bf3758e4261b0ac7cbc61b88c6338c924ac4abd23462266e2d8e94e56b5fe26b6cb93d0dbbcd1fa97db6b03
|
@@ -22,32 +22,54 @@ require_relative '../error'
|
|
22
22
|
|
23
23
|
module HTTP
|
24
24
|
module Protocol
|
25
|
-
module
|
25
|
+
module HTTP1
|
26
26
|
class Connection
|
27
27
|
CRLF = "\r\n".freeze
|
28
|
-
|
28
|
+
HTTP10 = "HTTP/1.0".freeze
|
29
|
+
HTTP11 = "HTTP/1.1".freeze
|
29
30
|
|
30
|
-
def initialize(stream, persistent = true)
|
31
|
+
def initialize(stream, version = HTTP11, persistent = true)
|
31
32
|
@stream = stream
|
32
33
|
|
34
|
+
@version = version
|
33
35
|
@persistent = persistent
|
34
36
|
|
35
37
|
@count = 0
|
36
38
|
end
|
37
39
|
|
38
40
|
attr :stream
|
41
|
+
|
42
|
+
# The default HTTP version to use (if none specified).
|
43
|
+
attr :version
|
44
|
+
|
45
|
+
# Whether the connection is persistent.
|
39
46
|
attr :persistent
|
47
|
+
|
48
|
+
# The number of requests processed.
|
40
49
|
attr :count
|
41
50
|
|
42
|
-
def version
|
43
|
-
|
51
|
+
def persistent?(version, headers)
|
52
|
+
if version == HTTP10
|
53
|
+
if connection = headers[CONNECTION]
|
54
|
+
return connection.include?(KEEP_ALIVE)
|
55
|
+
else
|
56
|
+
return false
|
57
|
+
end
|
58
|
+
else
|
59
|
+
if connection = headers[CONNECTION]
|
60
|
+
return !connection.include?(CLOSE)
|
61
|
+
else
|
62
|
+
return true
|
63
|
+
end
|
64
|
+
end
|
44
65
|
end
|
45
66
|
|
46
|
-
|
47
|
-
|
48
|
-
|
67
|
+
# Write the appropriate header for connection persistence.
|
68
|
+
def write_persistent_header(version)
|
69
|
+
if version == HTTP10
|
70
|
+
@stream.write("connection: keep-alive\r\n") if @persistent
|
49
71
|
else
|
50
|
-
|
72
|
+
@stream.write("connection: close\r\n") unless @persistent
|
51
73
|
end
|
52
74
|
end
|
53
75
|
|
@@ -61,11 +83,6 @@ module HTTP
|
|
61
83
|
return @stream
|
62
84
|
end
|
63
85
|
|
64
|
-
# Write the appropriate header for connection persistence.
|
65
|
-
def write_persistent_header
|
66
|
-
@stream.write("connection: keep-alive\r\n") if @persistent
|
67
|
-
end
|
68
|
-
|
69
86
|
# Close the connection and underlying stream.
|
70
87
|
def close
|
71
88
|
@stream.close
|
@@ -76,18 +93,21 @@ module HTTP
|
|
76
93
|
@stream.write("host: #{authority}\r\n")
|
77
94
|
|
78
95
|
write_headers(headers)
|
96
|
+
write_persistent_header(version)
|
79
97
|
|
80
98
|
@stream.flush
|
81
99
|
end
|
82
100
|
|
83
101
|
def write_response(version, status, headers, body = nil, head = false)
|
84
102
|
@stream.write("#{version} #{status}\r\n")
|
103
|
+
|
85
104
|
write_headers(headers)
|
105
|
+
write_persistent_header(version)
|
86
106
|
|
87
107
|
if head
|
88
108
|
write_body_head(body)
|
89
109
|
else
|
90
|
-
write_body(body)
|
110
|
+
write_body(body, version == HTTP11)
|
91
111
|
end
|
92
112
|
|
93
113
|
@stream.flush
|
@@ -119,7 +139,7 @@ module HTTP
|
|
119
139
|
method, path, version = read_line.split(/\s+/, 3)
|
120
140
|
headers = read_headers
|
121
141
|
|
122
|
-
@persistent = persistent?(headers)
|
142
|
+
@persistent = persistent?(version, headers)
|
123
143
|
|
124
144
|
body = read_request_body(headers)
|
125
145
|
|
@@ -134,7 +154,7 @@ module HTTP
|
|
134
154
|
|
135
155
|
headers = read_headers
|
136
156
|
|
137
|
-
@persistent = persistent?(headers)
|
157
|
+
@persistent = persistent?(version, headers)
|
138
158
|
|
139
159
|
body = read_response_body(method, status, headers)
|
140
160
|
|
@@ -187,8 +207,6 @@ module HTTP
|
|
187
207
|
end
|
188
208
|
|
189
209
|
def write_empty_body(body)
|
190
|
-
# Write empty body:
|
191
|
-
write_persistent_header
|
192
210
|
@stream.write("content-length: 0\r\n\r\n")
|
193
211
|
|
194
212
|
body.read if body
|
@@ -197,7 +215,6 @@ module HTTP
|
|
197
215
|
end
|
198
216
|
|
199
217
|
def write_fixed_length_body(body, length)
|
200
|
-
write_persistent_header
|
201
218
|
@stream.write("content-length: #{length}\r\n\r\n")
|
202
219
|
|
203
220
|
chunk_length = 0
|
@@ -219,7 +236,6 @@ module HTTP
|
|
219
236
|
end
|
220
237
|
|
221
238
|
def write_chunked_body(body)
|
222
|
-
write_persistent_header
|
223
239
|
@stream.write("transfer-encoding: chunked\r\n\r\n")
|
224
240
|
|
225
241
|
body.each do |chunk|
|
@@ -238,7 +254,6 @@ module HTTP
|
|
238
254
|
def write_body_and_close(body)
|
239
255
|
# We can't be persistent because we don't know the data length:
|
240
256
|
@persistent = false
|
241
|
-
write_persistent_header
|
242
257
|
|
243
258
|
@stream.write("\r\n")
|
244
259
|
|
@@ -263,8 +278,6 @@ module HTTP
|
|
263
278
|
end
|
264
279
|
|
265
280
|
def write_body_head(body)
|
266
|
-
write_persistent_header
|
267
|
-
|
268
281
|
if body.nil? or body.empty?
|
269
282
|
@stream.write("content-length: 0\r\n\r\n")
|
270
283
|
elsif length = body.length
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: http-protocol
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.6.0
|
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-
|
11
|
+
date: 2018-10-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: http-hpack
|
@@ -83,8 +83,7 @@ files:
|
|
83
83
|
- lib/http/protocol.rb
|
84
84
|
- lib/http/protocol/error.rb
|
85
85
|
- lib/http/protocol/headers.rb
|
86
|
-
- lib/http/protocol/
|
87
|
-
- lib/http/protocol/http11/connection.rb
|
86
|
+
- lib/http/protocol/http1/connection.rb
|
88
87
|
- lib/http/protocol/http2/client.rb
|
89
88
|
- lib/http/protocol/http2/connection.rb
|
90
89
|
- lib/http/protocol/http2/continuation_frame.rb
|
@@ -1,52 +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 '../http11/connection'
|
22
|
-
|
23
|
-
module HTTP
|
24
|
-
module Protocol
|
25
|
-
module HTTP10
|
26
|
-
class Connection < HTTP11::Connection
|
27
|
-
VERSION = "HTTP/1.0".freeze
|
28
|
-
|
29
|
-
def version
|
30
|
-
VERSION
|
31
|
-
end
|
32
|
-
|
33
|
-
def persistent?(headers)
|
34
|
-
if connection = headers[CONNECTION]
|
35
|
-
return connection.include?(KEEP_ALIVE)
|
36
|
-
else
|
37
|
-
return false
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
def write_persistent_header
|
42
|
-
@stream.write("connection: keep-alive\r\n") if @persistent
|
43
|
-
end
|
44
|
-
|
45
|
-
def write_body(body, chunked = false)
|
46
|
-
# We don't support chunked encoding by default.
|
47
|
-
super(body, chunked)
|
48
|
-
end
|
49
|
-
end
|
50
|
-
end
|
51
|
-
end
|
52
|
-
end
|