http-parser 1.0.2 → 1.0.3
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 +6 -14
- data/ext/http-parser/http_parser.c +11 -1
- data/ext/http-parser/http_parser.h +9 -9
- data/lib/http-parser/parser.rb +19 -10
- data/lib/http-parser/version.rb +1 -1
- data/spec/parser_spec.rb +25 -0
- metadata +33 -40
checksums.yaml
CHANGED
@@ -1,15 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
metadata.gz: !binary |-
|
9
|
-
ODNiNzNmM2Q3ZjE4Mjk1NzFiMDQ5ZDM3YTUxNGM5OGVlNWI3MWMzMzQ5NjIx
|
10
|
-
NGQ0YTYyYzYyNDZhOTE4NTZkMGYxZjY3ZjllMzViZGY0Nzk3NDM0NmFjYTll
|
11
|
-
YzI3NjFiOGJiNjI0MmFmZDc4NjJkOTI0YmFlNjkwMmM5NDVmYmU=
|
12
|
-
data.tar.gz: !binary |-
|
13
|
-
Nzc3MTM3ZTc2ZTJjMzYxZThmY2IzMTJlMWQzZGU4MjIyZDNkODMyN2RmNWE2
|
14
|
-
OTNkYzYzMTM1MjM1MjMyOTUxZDkzY2VjMzk4YzU4NTZmMTQ2ODQwOWZkMWVj
|
15
|
-
ZmIyM2Q4MzkwN2Y4NmY5OTJkZGIyNTI0MTUyZWZkYzQ5ZDQxMWQ=
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 4ee24befc2a0a23054f11edb4379b9b6b1f8d21a
|
4
|
+
data.tar.gz: 816280693464c8c5daa1c7fb20fe4954c3dd1a26
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 1846519857ad32e3f688cf18f28fb3dd2cd33fa4c0a0909d6a2c934218b1ae5df30101b54a8b100cb8caaf28482a964e8e17ef5594abc91fddcb575d67ac5091
|
7
|
+
data.tar.gz: 82c5dba81e1673ab22497e5e1adda9d6f89ab115795747bc64a0043ced1511880c65d003b379a4f35e89976d92bdf793933bf196b2002876edb431f2c2dcc4c6
|
@@ -634,7 +634,17 @@ size_t http_parser_execute (http_parser *parser,
|
|
634
634
|
|
635
635
|
if (PARSING_HEADER(parser->state)) {
|
636
636
|
++parser->nread;
|
637
|
-
/*
|
637
|
+
/* Don't allow the total size of the HTTP headers (including the status
|
638
|
+
* line) to exceed HTTP_MAX_HEADER_SIZE. This check is here to protect
|
639
|
+
* embedders against denial-of-service attacks where the attacker feeds
|
640
|
+
* us a never-ending header that the embedder keeps buffering.
|
641
|
+
*
|
642
|
+
* This check is arguably the responsibility of embedders but we're doing
|
643
|
+
* it on the embedder's behalf because most won't bother and this way we
|
644
|
+
* make the web a little safer. HTTP_MAX_HEADER_SIZE is still far bigger
|
645
|
+
* than any reasonable request or response so this should never affect
|
646
|
+
* day-to-day operation.
|
647
|
+
*/
|
638
648
|
if (parser->nread > HTTP_MAX_HEADER_SIZE) {
|
639
649
|
SET_ERRNO(HPE_HEADER_OVERFLOW);
|
640
650
|
goto error;
|
@@ -193,11 +193,11 @@ enum http_errno {
|
|
193
193
|
|
194
194
|
struct http_parser {
|
195
195
|
/** PRIVATE **/
|
196
|
-
unsigned
|
197
|
-
unsigned
|
198
|
-
unsigned
|
199
|
-
unsigned
|
200
|
-
unsigned
|
196
|
+
unsigned int type : 2; /* enum http_parser_type */
|
197
|
+
unsigned int flags : 6; /* F_* values from 'flags' enum; semi-public */
|
198
|
+
unsigned int state : 8; /* enum state from http_parser.c */
|
199
|
+
unsigned int header_state : 8; /* enum header_state from http_parser.c */
|
200
|
+
unsigned int index : 8; /* index into current matcher */
|
201
201
|
|
202
202
|
uint32_t nread; /* # bytes read in various scenarios */
|
203
203
|
uint64_t content_length; /* # bytes in body (0 if no Content-Length header) */
|
@@ -205,16 +205,16 @@ struct http_parser {
|
|
205
205
|
/** READ-ONLY **/
|
206
206
|
unsigned short http_major;
|
207
207
|
unsigned short http_minor;
|
208
|
-
unsigned
|
209
|
-
unsigned
|
210
|
-
unsigned
|
208
|
+
unsigned int status_code : 16; /* responses only */
|
209
|
+
unsigned int method : 8; /* requests only */
|
210
|
+
unsigned int http_errno : 7;
|
211
211
|
|
212
212
|
/* 1 = Upgrade header was present and the parser has exited because of that.
|
213
213
|
* 0 = No upgrade header present.
|
214
214
|
* Should be checked when http_parser_execute() returns in addition to
|
215
215
|
* error checking.
|
216
216
|
*/
|
217
|
-
unsigned
|
217
|
+
unsigned int upgrade : 1;
|
218
218
|
|
219
219
|
/** PUBLIC **/
|
220
220
|
void *data; /* A pointer to get hook to the "connection" or "socket" object */
|
data/lib/http-parser/parser.rb
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
|
2
2
|
module HttpParser
|
3
3
|
class Parser
|
4
|
+
CALLBACKS = [:on_message_begin, :on_url, :on_status_complete, :on_header_field, :on_header_value, :on_headers_complete, :on_body, :on_message_complete]
|
5
|
+
|
4
6
|
#
|
5
7
|
# Returns a new request/response instance variable
|
6
8
|
#
|
@@ -12,9 +14,16 @@ module HttpParser
|
|
12
14
|
#
|
13
15
|
# Initializes the Parser instance.
|
14
16
|
#
|
15
|
-
def initialize
|
17
|
+
def initialize(callback_obj = nil)
|
16
18
|
@settings = ::HttpParser::Settings.new
|
17
19
|
@callbacks = {} # so GC doesn't clean them up on java
|
20
|
+
|
21
|
+
if not callback_obj.nil?
|
22
|
+
CALLBACKS.each do |callback|
|
23
|
+
self.__send__(callback, &callback_obj.method(callback)) if callback_obj.respond_to? callback
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
18
27
|
yield self if block_given?
|
19
28
|
end
|
20
29
|
|
@@ -24,7 +33,7 @@ module HttpParser
|
|
24
33
|
# @yield [instance]
|
25
34
|
# The given block will be called when the HTTP message begins.
|
26
35
|
#
|
27
|
-
# @yieldparam [
|
36
|
+
# @yieldparam [HttpParser::Instance] instance
|
28
37
|
# The state so far of the request / response being processed.
|
29
38
|
#
|
30
39
|
def on_message_begin(&block)
|
@@ -40,7 +49,7 @@ module HttpParser
|
|
40
49
|
# The given block will be called when the Request URI is recognized
|
41
50
|
# within the Request-Line.
|
42
51
|
#
|
43
|
-
# @yieldparam [
|
52
|
+
# @yieldparam [HttpParser::Instance] instance
|
44
53
|
# The state so far of the request / response being processed.
|
45
54
|
#
|
46
55
|
# @yieldparam [String] url
|
@@ -60,7 +69,7 @@ module HttpParser
|
|
60
69
|
# @yield [instance]
|
61
70
|
# The given block will be called when the status is recognized.
|
62
71
|
#
|
63
|
-
# @yieldparam [
|
72
|
+
# @yieldparam [HttpParser::Instance] instance
|
64
73
|
# The state so far of the request / response being processed.
|
65
74
|
#
|
66
75
|
def on_status_complete(&block)
|
@@ -76,7 +85,7 @@ module HttpParser
|
|
76
85
|
# The given block will be called when a Header name is recognized
|
77
86
|
# in the Headers.
|
78
87
|
#
|
79
|
-
# @yieldparam [
|
88
|
+
# @yieldparam [HttpParser::Instance] instance
|
80
89
|
# The state so far of the request / response being processed.
|
81
90
|
#
|
82
91
|
# @yieldparam [String] field
|
@@ -97,7 +106,7 @@ module HttpParser
|
|
97
106
|
# The given block will be called when a Header value is recognized
|
98
107
|
# in the Headers.
|
99
108
|
#
|
100
|
-
# @yieldparam [
|
109
|
+
# @yieldparam [HttpParser::Instance] instance
|
101
110
|
# The state so far of the request / response being processed.
|
102
111
|
#
|
103
112
|
# @yieldparam [String] value
|
@@ -117,7 +126,7 @@ module HttpParser
|
|
117
126
|
# @yield [instance]
|
118
127
|
# The given block will be called when the Headers stop.
|
119
128
|
#
|
120
|
-
# @yieldparam [
|
129
|
+
# @yieldparam [HttpParser::Instance] instance
|
121
130
|
# The state so far of the request / response being processed.
|
122
131
|
#
|
123
132
|
def on_headers_complete(&block)
|
@@ -133,7 +142,7 @@ module HttpParser
|
|
133
142
|
# The given block will be called when the body is recognized in the
|
134
143
|
# message body.
|
135
144
|
#
|
136
|
-
# @yieldparam [
|
145
|
+
# @yieldparam [HttpParser::Instance] instance
|
137
146
|
# The state so far of the request / response being processed.
|
138
147
|
#
|
139
148
|
# @yieldparam [String] body
|
@@ -154,7 +163,7 @@ module HttpParser
|
|
154
163
|
# @yield [instance]
|
155
164
|
# The given block will be called when the message completes.
|
156
165
|
#
|
157
|
-
# @yieldparam [
|
166
|
+
# @yieldparam [HttpParser::Instance] instance
|
158
167
|
# The state so far of the request / response being processed.
|
159
168
|
#
|
160
169
|
def on_message_complete(&block)
|
@@ -166,7 +175,7 @@ module HttpParser
|
|
166
175
|
#
|
167
176
|
# Parses data.
|
168
177
|
#
|
169
|
-
# @param [
|
178
|
+
# @param [HttpParser::Instance] inst
|
170
179
|
# The state so far of the request / response being processed.
|
171
180
|
#
|
172
181
|
# @param [String] data
|
data/lib/http-parser/version.rb
CHANGED
data/spec/parser_spec.rb
CHANGED
@@ -284,5 +284,30 @@ describe HttpParser::Parser, "#initialize" do
|
|
284
284
|
@begun.should == 2
|
285
285
|
end
|
286
286
|
end
|
287
|
+
|
288
|
+
describe "method based instead of block based" do
|
289
|
+
class SomeParserClass
|
290
|
+
attr_reader :url
|
291
|
+
|
292
|
+
def on_url(inst, data)
|
293
|
+
@url = data
|
294
|
+
end
|
295
|
+
end
|
296
|
+
|
297
|
+
let(:expected) { '/foo?q=1' }
|
298
|
+
|
299
|
+
it "should simplify the process" do
|
300
|
+
callbacks = SomeParserClass.new
|
301
|
+
parser = described_class.new(callbacks)
|
302
|
+
|
303
|
+
parser.parse @inst, "GET "
|
304
|
+
|
305
|
+
callbacks.url.should be_nil
|
306
|
+
|
307
|
+
parser.parse @inst, "#{expected} HTTP/1.1"
|
308
|
+
|
309
|
+
callbacks.url.should == expected
|
310
|
+
end
|
311
|
+
end
|
287
312
|
end
|
288
313
|
|
metadata
CHANGED
@@ -1,79 +1,74 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: http-parser
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Stephen von Takach
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-
|
11
|
+
date: 2013-11-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: ffi-compiler
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- -
|
17
|
+
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: 0.0.2
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
20
22
|
version_requirements: !ruby/object:Gem::Requirement
|
21
23
|
requirements:
|
22
|
-
- -
|
24
|
+
- - ">="
|
23
25
|
- !ruby/object:Gem::Version
|
24
26
|
version: 0.0.2
|
25
|
-
type: :runtime
|
26
|
-
prerelease: false
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rake
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- -
|
31
|
+
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version:
|
34
|
-
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
35
36
|
version_requirements: !ruby/object:Gem::Requirement
|
36
37
|
requirements:
|
37
|
-
- -
|
38
|
+
- - ">="
|
38
39
|
- !ruby/object:Gem::Version
|
39
|
-
version:
|
40
|
-
MA==
|
41
|
-
type: :runtime
|
42
|
-
prerelease: false
|
40
|
+
version: '0'
|
43
41
|
- !ruby/object:Gem::Dependency
|
44
42
|
name: rspec
|
45
43
|
requirement: !ruby/object:Gem::Requirement
|
46
44
|
requirements:
|
47
|
-
- -
|
45
|
+
- - ">="
|
48
46
|
- !ruby/object:Gem::Version
|
49
|
-
version:
|
50
|
-
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
51
50
|
version_requirements: !ruby/object:Gem::Requirement
|
52
51
|
requirements:
|
53
|
-
- -
|
52
|
+
- - ">="
|
54
53
|
- !ruby/object:Gem::Version
|
55
|
-
version:
|
56
|
-
MA==
|
57
|
-
type: :development
|
58
|
-
prerelease: false
|
54
|
+
version: '0'
|
59
55
|
- !ruby/object:Gem::Dependency
|
60
56
|
name: yard
|
61
57
|
requirement: !ruby/object:Gem::Requirement
|
62
58
|
requirements:
|
63
|
-
- -
|
59
|
+
- - ">="
|
64
60
|
- !ruby/object:Gem::Version
|
65
|
-
version:
|
66
|
-
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
67
64
|
version_requirements: !ruby/object:Gem::Requirement
|
68
65
|
requirements:
|
69
|
-
- -
|
66
|
+
- - ">="
|
70
67
|
- !ruby/object:Gem::Version
|
71
|
-
version:
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
description: ! " A super fast http parser for ruby.\n Cross platform and multiple
|
76
|
-
ruby implementation support thanks to ffi.\n"
|
68
|
+
version: '0'
|
69
|
+
description: |2
|
70
|
+
A super fast http parser for ruby.
|
71
|
+
Cross platform and multiple ruby implementation support thanks to ffi.
|
77
72
|
email:
|
78
73
|
- steve@cotag.me
|
79
74
|
executables: []
|
@@ -82,12 +77,12 @@ extensions:
|
|
82
77
|
extra_rdoc_files:
|
83
78
|
- README.md
|
84
79
|
files:
|
85
|
-
- lib/http-parser.rb
|
86
80
|
- lib/http-parser/errors.rb
|
87
81
|
- lib/http-parser/ext.rb
|
88
82
|
- lib/http-parser/parser.rb
|
89
83
|
- lib/http-parser/types.rb
|
90
84
|
- lib/http-parser/version.rb
|
85
|
+
- lib/http-parser.rb
|
91
86
|
- Rakefile
|
92
87
|
- http-parser.gemspec
|
93
88
|
- README.md
|
@@ -108,19 +103,17 @@ require_paths:
|
|
108
103
|
- lib
|
109
104
|
required_ruby_version: !ruby/object:Gem::Requirement
|
110
105
|
requirements:
|
111
|
-
- -
|
106
|
+
- - ">="
|
112
107
|
- !ruby/object:Gem::Version
|
113
|
-
version:
|
114
|
-
MA==
|
108
|
+
version: '0'
|
115
109
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
116
110
|
requirements:
|
117
|
-
- -
|
111
|
+
- - ">="
|
118
112
|
- !ruby/object:Gem::Version
|
119
|
-
version:
|
120
|
-
MA==
|
113
|
+
version: '0'
|
121
114
|
requirements: []
|
122
115
|
rubyforge_project:
|
123
|
-
rubygems_version: 2.0.
|
116
|
+
rubygems_version: 2.0.3
|
124
117
|
signing_key:
|
125
118
|
specification_version: 4
|
126
119
|
summary: Ruby bindings to joyent/http-parser
|