jls-http_parser.rb 0.5.3.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -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: