jls-http_parser.rb 0.5.3.1

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.
@@ -0,0 +1,229 @@
1
+ [
2
+ {
3
+ "name": "google 301",
4
+ "type": "HTTP_RESPONSE",
5
+ "raw": "HTTP/1.1 301 Moved Permanently\r\nLocation: http://www.google.com/\r\nContent-Type: text/html; charset=UTF-8\r\nDate: Sun, 26 Apr 2009 11:11:49 GMT\r\nExpires: Tue, 26 May 2009 11:11:49 GMT\r\nX-$PrototypeBI-Version: 1.6.0.3\r\nCache-Control: public, max-age=2592000\r\nServer: gws\r\nContent-Length: 219 \r\n\r\n<HTML><HEAD><meta http-equiv=\"content-type\" content=\"text/html;charset=utf-8\">\n<TITLE>301 Moved</TITLE></HEAD><BODY>\n<H1>301 Moved</H1>\nThe document has moved\n<A HREF=\"http://www.google.com/\">here</A>.\r\n</BODY></HTML>\r\n",
6
+ "should_keep_alive": true,
7
+ "message_complete_on_eof": false,
8
+ "http_major": 1,
9
+ "http_minor": 1,
10
+ "status_code": 301,
11
+ "num_headers": 8,
12
+ "headers": {
13
+ "Location": "http://www.google.com/",
14
+ "Content-Type": "text/html; charset=UTF-8",
15
+ "Date": "Sun, 26 Apr 2009 11:11:49 GMT",
16
+ "Expires": "Tue, 26 May 2009 11:11:49 GMT",
17
+ "X-$PrototypeBI-Version": "1.6.0.3",
18
+ "Cache-Control": "public, max-age=2592000",
19
+ "Server": "gws",
20
+ "Content-Length": "219 "
21
+ },
22
+ "body": "<HTML><HEAD><meta http-equiv=\"content-type\" content=\"text/html;charset=utf-8\">\n<TITLE>301 Moved</TITLE></HEAD><BODY>\n<H1>301 Moved</H1>\nThe document has moved\n<A HREF=\"http://www.google.com/\">here</A>.\r\n</BODY></HTML>\r\n"
23
+ },
24
+ {
25
+ "name": "no content-length response",
26
+ "type": "HTTP_RESPONSE",
27
+ "raw": "HTTP/1.1 200 OK\r\nDate: Tue, 04 Aug 2009 07:59:32 GMT\r\nServer: Apache\r\nX-Powered-By: Servlet/2.5 JSP/2.1\r\nContent-Type: text/xml; charset=utf-8\r\nConnection: close\r\n\r\n<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<SOAP-ENV:Envelope xmlns:SOAP-ENV=\"http://schemas.xmlsoap.org/soap/envelope/\">\n <SOAP-ENV:Body>\n <SOAP-ENV:Fault>\n <faultcode>SOAP-ENV:Client</faultcode>\n <faultstring>Client Error</faultstring>\n </SOAP-ENV:Fault>\n </SOAP-ENV:Body>\n</SOAP-ENV:Envelope>",
28
+ "should_keep_alive": false,
29
+ "message_complete_on_eof": true,
30
+ "http_major": 1,
31
+ "http_minor": 1,
32
+ "status_code": 200,
33
+ "num_headers": 5,
34
+ "headers": {
35
+ "Date": "Tue, 04 Aug 2009 07:59:32 GMT",
36
+ "Server": "Apache",
37
+ "X-Powered-By": "Servlet/2.5 JSP/2.1",
38
+ "Content-Type": "text/xml; charset=utf-8",
39
+ "Connection": "close"
40
+ },
41
+ "body": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<SOAP-ENV:Envelope xmlns:SOAP-ENV=\"http://schemas.xmlsoap.org/soap/envelope/\">\n <SOAP-ENV:Body>\n <SOAP-ENV:Fault>\n <faultcode>SOAP-ENV:Client</faultcode>\n <faultstring>Client Error</faultstring>\n </SOAP-ENV:Fault>\n </SOAP-ENV:Body>\n</SOAP-ENV:Envelope>"
42
+ },
43
+ {
44
+ "name": "404 no headers no body",
45
+ "type": "HTTP_RESPONSE",
46
+ "raw": "HTTP/1.1 404 Not Found\r\n\r\n",
47
+ "should_keep_alive": true,
48
+ "message_complete_on_eof": false,
49
+ "http_major": 1,
50
+ "http_minor": 1,
51
+ "status_code": 404,
52
+ "num_headers": 0,
53
+ "headers": {
54
+
55
+ },
56
+ "body_size": 0,
57
+ "body": ""
58
+ },
59
+ {
60
+ "name": "301 no response phrase",
61
+ "type": "HTTP_RESPONSE",
62
+ "raw": "HTTP/1.1 301\r\n\r\n",
63
+ "should_keep_alive": true,
64
+ "message_complete_on_eof": false,
65
+ "http_major": 1,
66
+ "http_minor": 1,
67
+ "status_code": 301,
68
+ "num_headers": 0,
69
+ "headers": {
70
+
71
+ },
72
+ "body": ""
73
+ },
74
+ {
75
+ "name": "200 trailing space on chunked body",
76
+ "type": "HTTP_RESPONSE",
77
+ "raw": "HTTP/1.1 200 OK\r\nContent-Type: text/plain\r\nTransfer-Encoding: chunked\r\n\r\n25 \r\nThis is the data in the first chunk\r\n\r\n1C\r\nand this is the second one\r\n\r\n0 \r\n\r\n",
78
+ "should_keep_alive": true,
79
+ "message_complete_on_eof": false,
80
+ "http_major": 1,
81
+ "http_minor": 1,
82
+ "status_code": 200,
83
+ "num_headers": 2,
84
+ "headers": {
85
+ "Content-Type": "text/plain",
86
+ "Transfer-Encoding": "chunked"
87
+ },
88
+ "body_size": 65,
89
+ "body": "This is the data in the first chunk\r\nand this is the second one\r\n"
90
+ },
91
+ {
92
+ "name": "no carriage ret",
93
+ "type": "HTTP_RESPONSE",
94
+ "raw": "HTTP/1.1 200 OK\nContent-Type: text/html; charset=utf-8\nConnection: close\n\nthese headers are from http://news.ycombinator.com/",
95
+ "should_keep_alive": false,
96
+ "message_complete_on_eof": true,
97
+ "http_major": 1,
98
+ "http_minor": 1,
99
+ "status_code": 200,
100
+ "num_headers": 2,
101
+ "headers": {
102
+ "Content-Type": "text/html; charset=utf-8",
103
+ "Connection": "close"
104
+ },
105
+ "body": "these headers are from http://news.ycombinator.com/"
106
+ },
107
+ {
108
+ "name": "proxy connection",
109
+ "type": "HTTP_RESPONSE",
110
+ "raw": "HTTP/1.1 200 OK\r\nContent-Type: text/html; charset=UTF-8\r\nContent-Length: 11\r\nProxy-Connection: close\r\nDate: Thu, 31 Dec 2009 20:55:48 +0000\r\n\r\nhello world",
111
+ "should_keep_alive": false,
112
+ "message_complete_on_eof": false,
113
+ "http_major": 1,
114
+ "http_minor": 1,
115
+ "status_code": 200,
116
+ "num_headers": 4,
117
+ "headers": {
118
+ "Content-Type": "text/html; charset=UTF-8",
119
+ "Content-Length": "11",
120
+ "Proxy-Connection": "close",
121
+ "Date": "Thu, 31 Dec 2009 20:55:48 +0000"
122
+ },
123
+ "body": "hello world"
124
+ },
125
+ {
126
+ "name": "underscore header key",
127
+ "type": "HTTP_RESPONSE",
128
+ "raw": "HTTP/1.1 200 OK\r\nServer: DCLK-AdSvr\r\nContent-Type: text/xml\r\nContent-Length: 0\r\nDCLK_imp: v7;x;114750856;0-0;0;17820020;0/0;21603567/21621457/1;;~okv=;dcmt=text/xml;;~cs=o\r\n\r\n",
129
+ "should_keep_alive": true,
130
+ "message_complete_on_eof": false,
131
+ "http_major": 1,
132
+ "http_minor": 1,
133
+ "status_code": 200,
134
+ "num_headers": 4,
135
+ "headers": {
136
+ "Server": "DCLK-AdSvr",
137
+ "Content-Type": "text/xml",
138
+ "Content-Length": "0",
139
+ "DCLK_imp": "v7;x;114750856;0-0;0;17820020;0/0;21603567/21621457/1;;~okv=;dcmt=text/xml;;~cs=o"
140
+ },
141
+ "body": ""
142
+ },
143
+ {
144
+ "name": "bonjourmadame.fr",
145
+ "type": "HTTP_RESPONSE",
146
+ "raw": "HTTP/1.0 301 Moved Permanently\r\nDate: Thu, 03 Jun 2010 09:56:32 GMT\r\nServer: Apache/2.2.3 (Red Hat)\r\nCache-Control: public\r\nPragma: \r\nLocation: http://www.bonjourmadame.fr/\r\nVary: Accept-Encoding\r\nContent-Length: 0\r\nContent-Type: text/html; charset=UTF-8\r\nConnection: keep-alive\r\n\r\n",
147
+ "should_keep_alive": true,
148
+ "message_complete_on_eof": false,
149
+ "http_major": 1,
150
+ "http_minor": 0,
151
+ "status_code": 301,
152
+ "num_headers": 9,
153
+ "headers": {
154
+ "Date": "Thu, 03 Jun 2010 09:56:32 GMT",
155
+ "Server": "Apache/2.2.3 (Red Hat)",
156
+ "Cache-Control": "public",
157
+ "Pragma": "",
158
+ "Location": "http://www.bonjourmadame.fr/",
159
+ "Vary": "Accept-Encoding",
160
+ "Content-Length": "0",
161
+ "Content-Type": "text/html; charset=UTF-8",
162
+ "Connection": "keep-alive"
163
+ },
164
+ "body": ""
165
+ },
166
+ {
167
+ "name": "field space",
168
+ "type": "HTTP_RESPONSE",
169
+ "raw": "HTTP/1.1 200 OK\r\nServer: Microsoft-IIS/6.0\r\nX-Powered-By: ASP.NET\r\nen-US Content-Type: text/xml\r\nContent-Type: text/xml\r\nContent-Length: 16\r\nDate: Fri, 23 Jul 2010 18:45:38 GMT\r\nConnection: keep-alive\r\n\r\n<xml>hello</xml>",
170
+ "should_keep_alive": true,
171
+ "message_complete_on_eof": false,
172
+ "http_major": 1,
173
+ "http_minor": 1,
174
+ "status_code": 200,
175
+ "num_headers": 7,
176
+ "headers": {
177
+ "Server": "Microsoft-IIS/6.0",
178
+ "X-Powered-By": "ASP.NET",
179
+ "en-US Content-Type": "text/xml",
180
+ "Content-Type": "text/xml",
181
+ "Content-Length": "16",
182
+ "Date": "Fri, 23 Jul 2010 18:45:38 GMT",
183
+ "Connection": "keep-alive"
184
+ },
185
+ "body": "<xml>hello</xml>"
186
+ },
187
+ {
188
+ "name": "field underscore",
189
+ "type": "HTTP_RESPONSE",
190
+ "raw": "HTTP/1.1 200 OK\r\nDate: Tue, 28 Sep 2010 01:14:13 GMT\r\nServer: Apache\r\nCache-Control: no-cache, must-revalidate\r\nExpires: Mon, 26 Jul 1997 05:00:00 GMT\r\n.et-Cookie: PlaxoCS=1274804622353690521; path=/; domain=.plaxo.com\r\nVary: Accept-Encoding\r\n_eep-Alive: timeout=45\r\n_onnection: Keep-Alive\r\nTransfer-Encoding: chunked\r\nContent-Type: text/html\r\nConnection: close\r\n\r\n0\r\n\r\n",
191
+ "should_keep_alive": false,
192
+ "message_complete_on_eof": false,
193
+ "http_major": 1,
194
+ "http_minor": 1,
195
+ "status_code": 200,
196
+ "num_headers": 11,
197
+ "headers": {
198
+ "Date": "Tue, 28 Sep 2010 01:14:13 GMT",
199
+ "Server": "Apache",
200
+ "Cache-Control": "no-cache, must-revalidate",
201
+ "Expires": "Mon, 26 Jul 1997 05:00:00 GMT",
202
+ ".et-Cookie": "PlaxoCS=1274804622353690521; path=/; domain=.plaxo.com",
203
+ "Vary": "Accept-Encoding",
204
+ "_eep-Alive": "timeout=45",
205
+ "_onnection": "Keep-Alive",
206
+ "Transfer-Encoding": "chunked",
207
+ "Content-Type": "text/html",
208
+ "Connection": "close"
209
+ },
210
+ "body": ""
211
+ },
212
+ {
213
+ "name": "non-ASCII in status line",
214
+ "type": "HTTP_RESPONSE",
215
+ "raw": "HTTP/1.1 500 Oriëntatieprobleem\r\nDate: Fri, 5 Nov 2010 23:07:12 GMT+2\r\nContent-Length: 0\r\nConnection: close\r\n\r\n",
216
+ "should_keep_alive": false,
217
+ "message_complete_on_eof": false,
218
+ "http_major": 1,
219
+ "http_minor": 1,
220
+ "status_code": 500,
221
+ "num_headers": 3,
222
+ "headers": {
223
+ "Date": "Fri, 5 Nov 2010 23:07:12 GMT+2",
224
+ "Content-Length": "0",
225
+ "Connection": "close"
226
+ },
227
+ "body": ""
228
+ }
229
+ ]
@@ -0,0 +1,42 @@
1
+ require 'rake/gempackagetask'
2
+ require 'rake/extensiontask'
3
+ require 'rake/javaextensiontask'
4
+
5
+ def gemspec
6
+ @clean_gemspec ||= eval(File.read(File.expand_path('../../http_parser.rb.gemspec', __FILE__)))
7
+ end
8
+
9
+ Rake::GemPackageTask.new(gemspec) do |pkg|
10
+ end
11
+
12
+ if RUBY_PLATFORM =~ /java/
13
+ Rake::JavaExtensionTask.new("ruby_http_parser", gemspec) do |ext|
14
+ ext.classpath = File.expand_path('../../ext/ruby_http_parser/vendor/http-parser-java/ext/primitives.jar', __FILE__)
15
+ end
16
+ else
17
+ Rake::ExtensionTask.new("ruby_http_parser", gemspec) do |ext|
18
+ unless RUBY_PLATFORM =~ /mswin|mingw/
19
+ ext.cross_compile = true
20
+ ext.cross_platform = ['x86-mingw32', 'x86-mswin32-60']
21
+
22
+ # inject 1.8/1.9 pure-ruby entry point
23
+ ext.cross_compiling do |spec|
24
+ spec.files += ['lib/ruby_http_parser.rb']
25
+ end
26
+ end
27
+ end
28
+ end
29
+
30
+ file 'lib/ruby_http_parser.rb' do |t|
31
+ File.open(t.name, 'wb') do |f|
32
+ f.write <<-eoruby
33
+ RUBY_VERSION =~ /(\\d+.\\d+)/
34
+ require "\#{$1}/ruby_http_parser"
35
+ eoruby
36
+ end
37
+ at_exit{ FileUtils.rm t.name if File.exists?(t.name) }
38
+ end
39
+
40
+ if Rake::Task.task_defined?(:cross)
41
+ task :cross => 'lib/ruby_http_parser.rb'
42
+ end
@@ -0,0 +1,65 @@
1
+ desc "Generate test fixtures"
2
+ task :fixtures => :submodules do
3
+ require 'yajl'
4
+ data = File.read File.expand_path('../../ext/ruby_http_parser/vendor/http-parser/test.c', __FILE__)
5
+
6
+ %w[ requests responses ].each do |type|
7
+ # find test definitions in between requests/responses[]= and .name=NULL
8
+ tmp = data[/#{type}\[\]\s*=(.+?),\s*\{\s*\.name=\s*NULL/m, 1]
9
+
10
+ # replace first { with a [ (parsing an array of test cases)
11
+ tmp.sub!('{','[')
12
+
13
+ # replace booleans
14
+ tmp.gsub!('TRUE', 'true')
15
+ tmp.gsub!('FALSE', 'false')
16
+
17
+ # remove macros and comments
18
+ tmp.gsub!(/^#(if|elif|endif|define).+$/,'')
19
+ tmp.gsub!(/\/\*(.+?)\*\/$/,'')
20
+
21
+ # HTTP_* enums become strings
22
+ tmp.gsub!(/(= )(HTTP_\w+)/){
23
+ "#{$1}#{$2.dump}"
24
+ }
25
+
26
+ # join multiline strings for body and raw data
27
+ tmp.gsub!(/((body|raw)\s*=)(.+?)(\n\s+[\},])/m){
28
+ before, after = $1, $4
29
+ raw = $3.split("\n").map{ |l| l.strip[1..-2] }.join('')
30
+ "#{before} \"#{raw}\" #{after}"
31
+ }
32
+
33
+ # make headers an array of array tuples
34
+ tmp.gsub!(/(\.headers\s*=)(.+?)(\s*,\.)/m){
35
+ before, after = $1, $3
36
+ raw = $2.gsub('{', '[').gsub('}', ']')
37
+ "#{before} #{raw} #{after}"
38
+ }
39
+
40
+ # .name= becomes "name":
41
+ tmp.gsub!(/^(.{2,5})\.(\w+)\s*=/){
42
+ "#{$1}#{$2.dump}: "
43
+ }
44
+
45
+ # evaluate addition expressions
46
+ tmp.gsub!(/(body_size\":\s*)(\d+)\+(\d+)/){
47
+ "#{$1}#{$2.to_i+$3.to_i}"
48
+ }
49
+
50
+ # end result array
51
+ tmp << ']'
52
+
53
+ # normalize data
54
+ results = Yajl.load(tmp, :symbolize_keys => true)
55
+ results.map{ |res|
56
+ res[:headers] and res[:headers] = Hash[*res[:headers].flatten]
57
+ res[:method] and res[:method].gsub!(/^HTTP_/, '')
58
+ }
59
+
60
+ # write to a file
61
+ File.open("spec/support/#{type}.json", 'w'){ |f|
62
+ f.write Yajl.dump(results, :pretty => true)
63
+ }
64
+ end
65
+ end
@@ -0,0 +1,5 @@
1
+ require "rspec/core/rake_task"
2
+
3
+ RSpec::Core::RakeTask.new do |t|
4
+ t.rspec_opts = %w(-fs -c)
5
+ end
@@ -0,0 +1,7 @@
1
+ desc "Fetch upstream submodules"
2
+ task :submodules do
3
+ if Dir['ext/ruby_http_parser/vendor/http-parser/*'].empty?
4
+ sh 'git submodule init'
5
+ sh 'git submodule update'
6
+ end
7
+ end
metadata ADDED
@@ -0,0 +1,172 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: jls-http_parser.rb
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.5.3.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Marc-Andre Cournoyer
9
+ - Aman Gupta
10
+ autorequire:
11
+ bindir: bin
12
+ cert_chain: []
13
+ date: 2012-04-27 00:00:00.000000000 Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: rake-compiler
17
+ requirement: !ruby/object:Gem::Requirement
18
+ none: false
19
+ requirements:
20
+ - - ! '>='
21
+ - !ruby/object:Gem::Version
22
+ version: 0.7.9
23
+ type: :development
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ none: false
27
+ requirements:
28
+ - - ! '>='
29
+ - !ruby/object:Gem::Version
30
+ version: 0.7.9
31
+ - !ruby/object:Gem::Dependency
32
+ name: rspec
33
+ requirement: !ruby/object:Gem::Requirement
34
+ none: false
35
+ requirements:
36
+ - - ! '>='
37
+ - !ruby/object:Gem::Version
38
+ version: 2.0.1
39
+ type: :development
40
+ prerelease: false
41
+ version_requirements: !ruby/object:Gem::Requirement
42
+ none: false
43
+ requirements:
44
+ - - ! '>='
45
+ - !ruby/object:Gem::Version
46
+ version: 2.0.1
47
+ - !ruby/object:Gem::Dependency
48
+ name: json
49
+ requirement: !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: 1.4.6
55
+ type: :development
56
+ prerelease: false
57
+ version_requirements: !ruby/object:Gem::Requirement
58
+ none: false
59
+ requirements:
60
+ - - ! '>='
61
+ - !ruby/object:Gem::Version
62
+ version: 1.4.6
63
+ - !ruby/object:Gem::Dependency
64
+ name: benchmark_suite
65
+ requirement: !ruby/object:Gem::Requirement
66
+ none: false
67
+ requirements:
68
+ - - ! '>='
69
+ - !ruby/object:Gem::Version
70
+ version: '0'
71
+ type: :development
72
+ prerelease: false
73
+ version_requirements: !ruby/object:Gem::Requirement
74
+ none: false
75
+ requirements:
76
+ - - ! '>='
77
+ - !ruby/object:Gem::Version
78
+ version: '0'
79
+ - !ruby/object:Gem::Dependency
80
+ name: ffi
81
+ requirement: !ruby/object:Gem::Requirement
82
+ none: false
83
+ requirements:
84
+ - - ! '>='
85
+ - !ruby/object:Gem::Version
86
+ version: '0'
87
+ type: :development
88
+ prerelease: false
89
+ version_requirements: !ruby/object:Gem::Requirement
90
+ none: false
91
+ requirements:
92
+ - - ! '>='
93
+ - !ruby/object:Gem::Version
94
+ version: '0'
95
+ - !ruby/object:Gem::Dependency
96
+ name: yajl-ruby
97
+ requirement: !ruby/object:Gem::Requirement
98
+ none: false
99
+ requirements:
100
+ - - ! '>='
101
+ - !ruby/object:Gem::Version
102
+ version: 0.8.1
103
+ type: :development
104
+ prerelease: false
105
+ version_requirements: !ruby/object:Gem::Requirement
106
+ none: false
107
+ requirements:
108
+ - - ! '>='
109
+ - !ruby/object:Gem::Version
110
+ version: 0.8.1
111
+ description: Ruby bindings to http://github.com/ry/http-parser and http://github.com/a2800276/http-parser.java
112
+ email:
113
+ - macournoyer@gmail.com
114
+ - aman@tmm1.net
115
+ executables: []
116
+ extensions:
117
+ - ext/ruby_http_parser/extconf.rb
118
+ extra_rdoc_files: []
119
+ files:
120
+ - .gitignore
121
+ - .gitmodules
122
+ - Gemfile
123
+ - Gemfile.lock
124
+ - LICENSE-MIT
125
+ - README.md
126
+ - Rakefile
127
+ - bench/standalone.rb
128
+ - bench/thin.rb
129
+ - ext/ruby_http_parser/.gitignore
130
+ - ext/ruby_http_parser/RubyHttpParserService.java
131
+ - ext/ruby_http_parser/ext_help.h
132
+ - ext/ruby_http_parser/extconf.rb
133
+ - ext/ruby_http_parser/org/ruby_http_parser/RubyHttpParser.java
134
+ - ext/ruby_http_parser/ruby_http_parser.c
135
+ - ext/ruby_http_parser/vendor/.gitkeep
136
+ - http_parser.rb.gemspec
137
+ - lib/http/parser.rb
138
+ - lib/http_parser.rb
139
+ - spec/parser_spec.rb
140
+ - spec/spec_helper.rb
141
+ - spec/support/requests.json
142
+ - spec/support/responses.json
143
+ - tasks/compile.rake
144
+ - tasks/fixtures.rake
145
+ - tasks/spec.rake
146
+ - tasks/submodules.rake
147
+ homepage: http://github.com/tmm1/http_parser.rb
148
+ licenses: []
149
+ post_install_message:
150
+ rdoc_options: []
151
+ require_paths:
152
+ - lib
153
+ required_ruby_version: !ruby/object:Gem::Requirement
154
+ none: false
155
+ requirements:
156
+ - - ! '>='
157
+ - !ruby/object:Gem::Version
158
+ version: '0'
159
+ required_rubygems_version: !ruby/object:Gem::Requirement
160
+ none: false
161
+ requirements:
162
+ - - ! '>='
163
+ - !ruby/object:Gem::Version
164
+ version: '0'
165
+ requirements: []
166
+ rubyforge_project:
167
+ rubygems_version: 1.8.21
168
+ signing_key:
169
+ specification_version: 3
170
+ summary: Simple callback-based HTTP request/response parser
171
+ test_files: []
172
+ has_rdoc: