http-protocol 0.16.0 → 0.17.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/http/protocol/headers.rb +1 -0
- data/lib/http/protocol/http1/connection.rb +45 -14
- data/lib/http/protocol/version.rb +1 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 192ee24ff847367b1c8f59d6108c6e32a725eddf64284a62e087034a9d4c1a43
|
4
|
+
data.tar.gz: bed20c2c1217b0279b9bec642df410a0a7e8ecab0cdbb2975a94a9f6e0dd33f3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a8d2032762049eeb8fc18ed69bcdcc7b7c7de1ff4108df5a0473b4ee2033e67138f981b866c66f9912a921684073cbec65a3075ce97f95ef7417b8b75927afc9
|
7
|
+
data.tar.gz: 39cbcf536e6eb442533586457e87c4295c8d106a6e8fac09cf1b45e2e25bbae5c4fc17a6368ecd1a634cd735f2e2dd264d37c9923f799f014ab35c800c779fd2
|
@@ -32,6 +32,7 @@ module HTTP
|
|
32
32
|
@stream = stream
|
33
33
|
|
34
34
|
@persistent = persistent
|
35
|
+
@upgrade = nil
|
35
36
|
|
36
37
|
@count = 0
|
37
38
|
end
|
@@ -41,9 +42,18 @@ module HTTP
|
|
41
42
|
# Whether the connection is persistent.
|
42
43
|
attr :persistent
|
43
44
|
|
45
|
+
# Whether the connection has been upgraded, and to what.
|
46
|
+
attr :upgrade
|
47
|
+
|
44
48
|
# The number of requests processed.
|
45
49
|
attr :count
|
46
50
|
|
51
|
+
def upgrade?(headers)
|
52
|
+
if upgrade = headers[UPGRADE]
|
53
|
+
return upgrade.first
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
47
57
|
def persistent?(version, headers)
|
48
58
|
if version == HTTP10
|
49
59
|
if connection = headers[CONNECTION]
|
@@ -60,18 +70,29 @@ module HTTP
|
|
60
70
|
end
|
61
71
|
end
|
62
72
|
|
73
|
+
def upgrade!(protocol)
|
74
|
+
@upgrade = protocol
|
75
|
+
@persistent = false
|
76
|
+
|
77
|
+
return @stream
|
78
|
+
end
|
79
|
+
|
63
80
|
# Write the appropriate header for connection persistence.
|
64
|
-
def
|
65
|
-
if
|
66
|
-
@stream.write("connection:
|
81
|
+
def write_connection_header(version)
|
82
|
+
if @upgrade
|
83
|
+
@stream.write("connection: upgrade\r\nupgrade: #{@upgrade}\r\n")
|
67
84
|
else
|
68
|
-
|
85
|
+
if version == HTTP10
|
86
|
+
@stream.write("connection: keep-alive\r\n") if @persistent
|
87
|
+
else
|
88
|
+
@stream.write("connection: close\r\n") unless @persistent
|
89
|
+
end
|
69
90
|
end
|
70
91
|
end
|
71
92
|
|
72
93
|
# Effectively close the connection and return the underlying IO.
|
73
94
|
# @return [IO] the underlying non-blocking IO.
|
74
|
-
def hijack
|
95
|
+
def hijack!
|
75
96
|
@persistent = false
|
76
97
|
|
77
98
|
@stream.flush
|
@@ -89,14 +110,14 @@ module HTTP
|
|
89
110
|
@stream.write("host: #{authority}\r\n")
|
90
111
|
|
91
112
|
write_headers(headers)
|
92
|
-
|
113
|
+
write_connection_header(version)
|
93
114
|
end
|
94
115
|
|
95
116
|
def write_response(version, status, headers, body = nil, head = false)
|
96
117
|
@stream.write("#{version} #{status}\r\n")
|
97
118
|
|
98
119
|
write_headers(headers)
|
99
|
-
|
120
|
+
write_connection_header(version)
|
100
121
|
write_body(body, version == HTTP11, head)
|
101
122
|
end
|
102
123
|
|
@@ -113,13 +134,7 @@ module HTTP
|
|
113
134
|
end
|
114
135
|
|
115
136
|
def read_line
|
116
|
-
|
117
|
-
# @stream.gets(CRLF, chomp: true) or raise EOFError
|
118
|
-
if line = @stream.gets(CRLF)
|
119
|
-
return line.chomp!(CRLF)
|
120
|
-
else
|
121
|
-
raise EOFError
|
122
|
-
end
|
137
|
+
@stream.gets(CRLF, chomp: true) or raise EOFError
|
123
138
|
end
|
124
139
|
|
125
140
|
def read_request
|
@@ -127,6 +142,7 @@ module HTTP
|
|
127
142
|
headers = read_headers
|
128
143
|
|
129
144
|
@persistent = persistent?(version, headers)
|
145
|
+
@upgrade = upgrade?(headers)
|
130
146
|
|
131
147
|
body = read_request_body(headers)
|
132
148
|
|
@@ -183,6 +199,19 @@ module HTTP
|
|
183
199
|
return chunk
|
184
200
|
end
|
185
201
|
|
202
|
+
def write_upgrade_body
|
203
|
+
@stream.write("\r\n")
|
204
|
+
@stream.flush
|
205
|
+
|
206
|
+
return @stream unless block_given?
|
207
|
+
|
208
|
+
begin
|
209
|
+
yield @stream
|
210
|
+
rescue
|
211
|
+
@stream.close_write
|
212
|
+
end
|
213
|
+
end
|
214
|
+
|
186
215
|
def write_empty_body(body)
|
187
216
|
@stream.write("content-length: 0\r\n\r\n")
|
188
217
|
@stream.flush
|
@@ -264,6 +293,8 @@ module HTTP
|
|
264
293
|
def write_body(body, chunked = true, head = false)
|
265
294
|
if body.nil? or body.empty?
|
266
295
|
write_empty_body(body)
|
296
|
+
# elsif body.respond_to?(:call)
|
297
|
+
# write_upgrade_body(&body)
|
267
298
|
elsif length = body.length
|
268
299
|
write_fixed_length_body(body, length, head)
|
269
300
|
elsif @persistent and chunked
|
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.17.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: 2019-
|
11
|
+
date: 2019-05-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: http-hpack
|
@@ -143,7 +143,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
143
143
|
- !ruby/object:Gem::Version
|
144
144
|
version: '0'
|
145
145
|
requirements: []
|
146
|
-
rubygems_version: 3.0.
|
146
|
+
rubygems_version: 3.0.2
|
147
147
|
signing_key:
|
148
148
|
specification_version: 4
|
149
149
|
summary: Provides abstractions to handle HTTP1 and HTTP2 protocols.
|