segregate 0.5.0 → 0.5.2
Sign up to get free protection for your applications and to get access to all the features.
- 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
|