segregate 0.5.0 → 0.5.2
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
- data/lib/segregate.rb +60 -17
- data/lib/segregate/http_regular_expressions.rb +1 -1
- data/lib/segregate/version.rb +2 -2
- metadata +5 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 71d89f3c3e90e41fb84af4faeb638c55b1e57f42
|
4
|
+
data.tar.gz: f0de163082142414642801e392f12c7d13448d38
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6996697e014269c5a661f51ad4dff60b6b11fbc400a849c18ac62987db430b5cba85b168f489cff1eaa7176c7cd1887ef3b1296bf10ab9cdb5d64797331eb4ce
|
7
|
+
data.tar.gz: 2549fd7247b7acbf4c7d3f8823f3679c4eccc4675bfe23b7ddaf120b4d78f464cb912d9bb1afbf9d06d6eedaeb98d9f80e5f7eb4303bbfb1f11241801ddb01a5
|
data/lib/segregate.rb
CHANGED
@@ -22,7 +22,14 @@ class Segregate
|
|
22
22
|
@uri.respond_to?(meth, include_private) || super
|
23
23
|
end
|
24
24
|
|
25
|
-
def
|
25
|
+
def debug message
|
26
|
+
if @debug
|
27
|
+
puts "DEBUG: " + message.t_s
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def initialize callback = nil, *args, **kwargs
|
32
|
+
@debug = kwargs[:debug] ? true : false
|
26
33
|
@callback = callback
|
27
34
|
@http_version = [nil, nil]
|
28
35
|
|
@@ -35,6 +42,8 @@ class Segregate
|
|
35
42
|
|
36
43
|
@stashed_data = ""
|
37
44
|
@stashed_body = ""
|
45
|
+
|
46
|
+
@header_order = []
|
38
47
|
end
|
39
48
|
|
40
49
|
def request?
|
@@ -83,24 +92,46 @@ class Segregate
|
|
83
92
|
|
84
93
|
def update_content_length
|
85
94
|
unless @body.empty?
|
86
|
-
@
|
87
|
-
|
95
|
+
if @body.length > 99999999999
|
96
|
+
@headers['transfer-encoding'] = 'chunked'
|
97
|
+
@headers.delete 'content-length'
|
98
|
+
else
|
99
|
+
@headers['content-length'] = @body.length.to_s
|
100
|
+
@headers.delete 'transfer-encoding'
|
101
|
+
end
|
88
102
|
end
|
89
103
|
end
|
90
104
|
|
91
105
|
def raw_data
|
92
106
|
raw_message = ""
|
93
107
|
update_content_length
|
94
|
-
|
108
|
+
|
109
|
+
build_headers raw_message
|
110
|
+
build_body raw_message
|
111
|
+
|
112
|
+
return raw_message
|
113
|
+
end
|
114
|
+
|
115
|
+
def build_headers raw_message
|
95
116
|
request? ? raw_message << request_line + "\r\n" : raw_message << status_line + "\r\n"
|
96
|
-
|
97
|
-
raw_message << "%s: %s\r\n" % [header, headers[header]]
|
117
|
+
@header_order.each do |header|
|
118
|
+
raw_message << "%s: %s\r\n" % [header, headers[header.downcase]]
|
98
119
|
end
|
99
|
-
|
100
|
-
raw_message << "\r\n" + @body + "\r\n" unless @body.empty?
|
101
120
|
raw_message << "\r\n"
|
102
121
|
end
|
103
122
|
|
123
|
+
def build_body raw_message
|
124
|
+
if @headers['content-length']
|
125
|
+
raw_message << @body
|
126
|
+
elsif @headers['transfer-encoding'] == 'chunked'
|
127
|
+
@body.scan(/.{1,65535}/).each do |chunk|
|
128
|
+
raw_message << "%s\r\n" % chunk.length.to_s(16)
|
129
|
+
raw_message << chunk + "\r\n"
|
130
|
+
end
|
131
|
+
raw_message << "0\r\n\r\n"
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
104
135
|
def parse_data data
|
105
136
|
data = StringIO.new(@stashed_data + data)
|
106
137
|
@stashed_data = ""
|
@@ -109,6 +140,8 @@ class Segregate
|
|
109
140
|
line, complete_line = get_next_line data
|
110
141
|
complete_line ? parse_line(line) : @stashed_data = line
|
111
142
|
end
|
143
|
+
|
144
|
+
data.close
|
112
145
|
end
|
113
146
|
|
114
147
|
def parse_line line
|
@@ -127,8 +160,17 @@ class Segregate
|
|
127
160
|
private
|
128
161
|
|
129
162
|
def get_next_line data
|
130
|
-
|
131
|
-
|
163
|
+
if @headers['content-length'] && @state >= :body
|
164
|
+
line = data.readline("\r\n")
|
165
|
+
@inital_line = line
|
166
|
+
[line, true]
|
167
|
+
else
|
168
|
+
line = data.readline("\r\n")
|
169
|
+
@inital_line = line
|
170
|
+
result = line.end_with?("\r\n")
|
171
|
+
line = line[0..-3] if result
|
172
|
+
[line, result]
|
173
|
+
end
|
132
174
|
end
|
133
175
|
|
134
176
|
def read_in_first_line line
|
@@ -139,9 +181,9 @@ class Segregate
|
|
139
181
|
elsif line =~ STATUS_LINE
|
140
182
|
parse_status_line line
|
141
183
|
elsif line =~ UNKNOWN_REQUEST_LINE
|
142
|
-
|
184
|
+
debug "Unknown http method: %s" % line[/^\S+/]
|
143
185
|
else
|
144
|
-
|
186
|
+
debug "Unknown first line: %s" % line
|
145
187
|
end
|
146
188
|
|
147
189
|
@state.next
|
@@ -169,8 +211,9 @@ class Segregate
|
|
169
211
|
if line.empty?
|
170
212
|
@state.next
|
171
213
|
else
|
172
|
-
key, value = line.split(":")
|
173
|
-
@
|
214
|
+
key, value = line.split(": ",2)
|
215
|
+
@header_order << key
|
216
|
+
@headers[key.downcase] = value
|
174
217
|
end
|
175
218
|
|
176
219
|
if headers_complete?
|
@@ -193,7 +236,7 @@ class Segregate
|
|
193
236
|
line = @stashed_body + line
|
194
237
|
@stashed_body = ""
|
195
238
|
|
196
|
-
if line.length
|
239
|
+
if line.length >= headers['content-length'].to_i
|
197
240
|
@body = line
|
198
241
|
@callback.on_body @body if @callback.respond_to?(:on_body)
|
199
242
|
@state.next
|
@@ -226,12 +269,12 @@ class Segregate
|
|
226
269
|
line = @stashed_body + line
|
227
270
|
@stashed_body = ""
|
228
271
|
|
229
|
-
if line.length
|
272
|
+
if line.length >= @chunk_size
|
230
273
|
@body << line
|
231
274
|
@callback.on_body line if @callback.respond_to?(:on_body)
|
232
275
|
@chunked_body_state.next
|
233
276
|
else
|
234
|
-
@stashed_body = line
|
277
|
+
@stashed_body = @inital_line.end_with?("\r\n") ? (line + "\r\n") : line
|
235
278
|
end
|
236
279
|
end
|
237
280
|
end
|
@@ -1,5 +1,5 @@
|
|
1
1
|
class Segregate
|
2
2
|
REQUEST_LINE = /^(#{HTTP_METHODS.join("|")})\s(\*|\S+)\sHTTP\/(\d).(\d)$/
|
3
|
-
STATUS_LINE = /^HTTP\/(\d).(\d)\s(\d{3})\s([\w\s
|
3
|
+
STATUS_LINE = /^HTTP\/(\d).(\d)\s(\d{3})\s([\w\s-]+)$/
|
4
4
|
UNKNOWN_REQUEST_LINE = /^(\w+)\s(\*|\S+)\sHTTP\/(\d).(\d)$/
|
5
5
|
end
|
data/lib/segregate/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: segregate
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.
|
4
|
+
version: 0.5.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ben Slaughter
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-02-
|
11
|
+
date: 2014-02-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -101,13 +101,13 @@ executables: []
|
|
101
101
|
extensions: []
|
102
102
|
extra_rdoc_files: []
|
103
103
|
files:
|
104
|
-
- README.md
|
105
104
|
- LICENSE
|
105
|
+
- README.md
|
106
|
+
- lib/segregate.rb
|
106
107
|
- lib/segregate/http_headers.rb
|
107
108
|
- lib/segregate/http_methods.rb
|
108
109
|
- lib/segregate/http_regular_expressions.rb
|
109
110
|
- lib/segregate/version.rb
|
110
|
-
- lib/segregate.rb
|
111
111
|
- spec/segregate_spec.rb
|
112
112
|
- spec/spec_helper.rb
|
113
113
|
homepage: http://benslaughter.github.io/segregate/
|
@@ -130,7 +130,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
130
130
|
version: '0'
|
131
131
|
requirements: []
|
132
132
|
rubyforge_project:
|
133
|
-
rubygems_version: 2.
|
133
|
+
rubygems_version: 2.2.2
|
134
134
|
signing_key:
|
135
135
|
specification_version: 4
|
136
136
|
summary: Segregate http parser
|