http-parser 1.0.0 → 1.0.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.
- checksums.yaml +4 -4
- data/README.md +1 -1
- data/Rakefile +19 -0
- data/ext/Rakefile +0 -1
- data/ext/http-parser/http_parser.c +26 -2
- data/ext/http-parser/http_parser.h +14 -1
- data/http-parser.gemspec +1 -0
- data/lib/http-parser/parser.rb +1 -1
- data/lib/http-parser/version.rb +1 -1
- data/spec/error_spec.rb +9 -9
- data/spec/parser_spec.rb +14 -0
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ef7dd40436524e48ef90904d871caed3ba2754d6
|
4
|
+
data.tar.gz: d1eebb668464073456f155757c4d34d06c3ebd1d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 477ec97207cb8c602db5279f4e1ef315cb896d3d79e2669c712d0c4a950c36b941a8d1aa5ba490813e6bd5a6befcbd5947f00dd1d1e28acaeb340d20c789f111
|
7
|
+
data.tar.gz: e5b18b9ddd5bc2befbd6b334834bc9cd16f5428c2d0413bb791a0ede0141ca9f6dbed49daddc42177dcf96b5e51610fcdc92bc5ea5753b66f15e2cccb5d31cbf
|
data/README.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# http-parser
|
2
2
|
|
3
|
-
Ruby FFI bindings to [http-parser](https://github.com/joyent/http-parser)
|
3
|
+
Ruby FFI bindings to [http-parser](https://github.com/joyent/http-parser) [](https://travis-ci.org/cotag/http-parser)
|
4
4
|
|
5
5
|
## Install
|
6
6
|
|
data/Rakefile
CHANGED
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rake'
|
3
|
+
require 'rspec/core/rake_task'
|
4
|
+
|
5
|
+
task :default => [:compile, :test]
|
6
|
+
|
7
|
+
task :compile do
|
8
|
+
protect = ['http_parser.c', 'http_parser.h']
|
9
|
+
Dir["ext/http-parser/**/*"].each do |file|
|
10
|
+
begin
|
11
|
+
next if protect.include? File.basename(file)
|
12
|
+
FileUtils.rm file
|
13
|
+
rescue
|
14
|
+
end
|
15
|
+
end
|
16
|
+
system 'cd ext && rake'
|
17
|
+
end
|
18
|
+
|
19
|
+
RSpec::Core::RakeTask.new(:test)
|
data/ext/Rakefile
CHANGED
@@ -5,5 +5,4 @@ FFI::Compiler::CompileTask.new('http-parser-ext') do |t|
|
|
5
5
|
t.cflags << "-D_GNU_SOURCE=1" if RbConfig::CONFIG["host_os"].downcase =~ /mingw/
|
6
6
|
t.cflags << "-arch x86_64 -arch i386" if t.platform.mac?
|
7
7
|
t.ldflags << "-arch x86_64 -arch i386" if t.platform.mac?
|
8
|
-
t.export '../lib/http-parser/ext.rb'
|
9
8
|
end
|
@@ -929,6 +929,7 @@ size_t http_parser_execute (http_parser *parser,
|
|
929
929
|
} else if (parser->index == 2 && ch == 'P') {
|
930
930
|
parser->method = HTTP_COPY;
|
931
931
|
} else {
|
932
|
+
SET_ERRNO(HPE_INVALID_METHOD);
|
932
933
|
goto error;
|
933
934
|
}
|
934
935
|
} else if (parser->method == HTTP_MKCOL) {
|
@@ -941,12 +942,14 @@ size_t http_parser_execute (http_parser *parser,
|
|
941
942
|
} else if (parser->index == 2 && ch == 'A') {
|
942
943
|
parser->method = HTTP_MKACTIVITY;
|
943
944
|
} else {
|
945
|
+
SET_ERRNO(HPE_INVALID_METHOD);
|
944
946
|
goto error;
|
945
947
|
}
|
946
948
|
} else if (parser->method == HTTP_SUBSCRIBE) {
|
947
949
|
if (parser->index == 1 && ch == 'E') {
|
948
950
|
parser->method = HTTP_SEARCH;
|
949
951
|
} else {
|
952
|
+
SET_ERRNO(HPE_INVALID_METHOD);
|
950
953
|
goto error;
|
951
954
|
}
|
952
955
|
} else if (parser->index == 1 && parser->method == HTTP_POST) {
|
@@ -957,13 +960,27 @@ size_t http_parser_execute (http_parser *parser,
|
|
957
960
|
} else if (ch == 'A') {
|
958
961
|
parser->method = HTTP_PATCH;
|
959
962
|
} else {
|
963
|
+
SET_ERRNO(HPE_INVALID_METHOD);
|
960
964
|
goto error;
|
961
965
|
}
|
962
966
|
} else if (parser->index == 2) {
|
963
967
|
if (parser->method == HTTP_PUT) {
|
964
|
-
if (ch == 'R')
|
968
|
+
if (ch == 'R') {
|
969
|
+
parser->method = HTTP_PURGE;
|
970
|
+
} else {
|
971
|
+
SET_ERRNO(HPE_INVALID_METHOD);
|
972
|
+
goto error;
|
973
|
+
}
|
965
974
|
} else if (parser->method == HTTP_UNLOCK) {
|
966
|
-
if (ch == 'S')
|
975
|
+
if (ch == 'S') {
|
976
|
+
parser->method = HTTP_UNSUBSCRIBE;
|
977
|
+
} else {
|
978
|
+
SET_ERRNO(HPE_INVALID_METHOD);
|
979
|
+
goto error;
|
980
|
+
}
|
981
|
+
} else {
|
982
|
+
SET_ERRNO(HPE_INVALID_METHOD);
|
983
|
+
goto error;
|
967
984
|
}
|
968
985
|
} else if (parser->index == 4 && parser->method == HTTP_PROPFIND && ch == 'P') {
|
969
986
|
parser->method = HTTP_PROPPATCH;
|
@@ -2173,3 +2190,10 @@ int
|
|
2173
2190
|
http_body_is_final(const struct http_parser *parser) {
|
2174
2191
|
return parser->state == s_message_done;
|
2175
2192
|
}
|
2193
|
+
|
2194
|
+
unsigned long
|
2195
|
+
http_parser_version(void) {
|
2196
|
+
return HTTP_PARSER_VERSION_MAJOR * 0x10000 |
|
2197
|
+
HTTP_PARSER_VERSION_MINOR * 0x00100 |
|
2198
|
+
HTTP_PARSER_VERSION_PATCH * 0x00001;
|
2199
|
+
}
|
@@ -27,6 +27,7 @@ extern "C" {
|
|
27
27
|
/* Also update SONAME in the Makefile whenever you change these. */
|
28
28
|
#define HTTP_PARSER_VERSION_MAJOR 2
|
29
29
|
#define HTTP_PARSER_VERSION_MINOR 1
|
30
|
+
#define HTTP_PARSER_VERSION_PATCH 0
|
30
31
|
|
31
32
|
#include <sys/types.h>
|
32
33
|
#if defined(_WIN32) && !defined(__MINGW32__) && (!defined(_MSC_VER) || _MSC_VER<1600)
|
@@ -68,7 +69,7 @@ typedef struct http_parser_settings http_parser_settings;
|
|
68
69
|
* HEAD request which may contain 'Content-Length' or 'Transfer-Encoding:
|
69
70
|
* chunked' headers that indicate the presence of a body.
|
70
71
|
*
|
71
|
-
* http_data_cb does not return data chunks. It will be call
|
72
|
+
* http_data_cb does not return data chunks. It will be call arbitrarally
|
72
73
|
* many times for each string. E.G. you might get 10 callbacks for "on_url"
|
73
74
|
* each providing just a few characters more data.
|
74
75
|
*/
|
@@ -262,6 +263,18 @@ struct http_parser_url {
|
|
262
263
|
};
|
263
264
|
|
264
265
|
|
266
|
+
/* Returns the library version. Bits 16-23 contain the major version number,
|
267
|
+
* bits 8-15 the minor version number and bits 0-7 the patch level.
|
268
|
+
* Usage example:
|
269
|
+
*
|
270
|
+
* unsigned long version = http_parser_version();
|
271
|
+
* unsigned major = (version >> 16) & 255;
|
272
|
+
* unsigned minor = (version >> 8) & 255;
|
273
|
+
* unsigned patch = version & 255;
|
274
|
+
* printf("http_parser v%u.%u.%u\n", major, minor, version);
|
275
|
+
*/
|
276
|
+
unsigned long http_parser_version(void);
|
277
|
+
|
265
278
|
void http_parser_init(http_parser *parser, enum http_parser_type type);
|
266
279
|
|
267
280
|
|
data/http-parser.gemspec
CHANGED
@@ -7,6 +7,7 @@ Gem::Specification.new do |s|
|
|
7
7
|
s.version = HttpParser::VERSION
|
8
8
|
s.authors = ["Stephen von Takach"]
|
9
9
|
s.email = ["steve@cotag.me"]
|
10
|
+
s.license = 'MIT'
|
10
11
|
s.homepage = "https://github.com/cotag/http-parser"
|
11
12
|
s.summary = "Ruby bindings to joyent/http-parser"
|
12
13
|
s.description = <<-EOF
|
data/lib/http-parser/parser.rb
CHANGED
data/lib/http-parser/version.rb
CHANGED
data/spec/error_spec.rb
CHANGED
@@ -5,24 +5,24 @@ describe HttpParser::Parser, "#initialize" do
|
|
5
5
|
@inst = HttpParser::Parser.new_instance
|
6
6
|
end
|
7
7
|
|
8
|
-
it "should return true when
|
9
|
-
subject.parse(@inst, "
|
10
|
-
@inst.error?.should
|
8
|
+
it "should return true when error" do
|
9
|
+
subject.parse(@inst, "GETS / HTTP/1.1\r\n").should be_true
|
10
|
+
@inst.error?.should be_true
|
11
11
|
end
|
12
12
|
|
13
|
-
it "should return false on
|
14
|
-
subject.parse(@inst, "
|
15
|
-
@inst.error?.should
|
13
|
+
it "should return false on success" do
|
14
|
+
subject.parse(@inst, "GET / HTTP/1.1\r\n").should be_false
|
15
|
+
@inst.error?.should be_false
|
16
16
|
end
|
17
17
|
|
18
18
|
it "the error should be inspectable" do
|
19
|
-
subject.parse(@inst, "GETS / HTTP/1.1\r\n").should
|
19
|
+
subject.parse(@inst, "GETS / HTTP/1.1\r\n").should be_true
|
20
20
|
@inst.error.should be_kind_of(::HttpParser::Error::INVALID_METHOD)
|
21
21
|
@inst.error?.should be_true
|
22
22
|
end
|
23
23
|
|
24
24
|
it "raises different error types depending on the error" do
|
25
|
-
subject.parse(@inst, "GET / HTTP/23\r\n").should
|
25
|
+
subject.parse(@inst, "GET / HTTP/23\r\n").should be_true
|
26
26
|
@inst.error.should be_kind_of(::HttpParser::Error::INVALID_VERSION)
|
27
27
|
@inst.error?.should be_true
|
28
28
|
end
|
@@ -35,7 +35,7 @@ describe HttpParser::Parser, "#initialize" do
|
|
35
35
|
end
|
36
36
|
|
37
37
|
it "should handle unhandled errors gracefully" do
|
38
|
-
subject.parse(@inst, "GET /foo?q=1 HTTP/1.1").should
|
38
|
+
subject.parse(@inst, "GET /foo?q=1 HTTP/1.1").should be_true
|
39
39
|
|
40
40
|
@inst.error?.should be_true
|
41
41
|
@inst.error.should be_kind_of(::HttpParser::Error::CALLBACK)
|
data/spec/parser_spec.rb
CHANGED
@@ -270,5 +270,19 @@ describe HttpParser::Parser, "#initialize" do
|
|
270
270
|
@inst.upgrade?.should be_true
|
271
271
|
end
|
272
272
|
end
|
273
|
+
|
274
|
+
describe "pipelined requests" do
|
275
|
+
subject do
|
276
|
+
@begun = 0
|
277
|
+
described_class.new do |parser|
|
278
|
+
parser.on_message_begin { @begun += 1 }
|
279
|
+
end
|
280
|
+
end
|
281
|
+
|
282
|
+
it "should trigger on a new request" do
|
283
|
+
subject.parse @inst, "GET /demo HTTP/1.1\r\n\r\nGET /demo HTTP/1.1\r\n\r\n"
|
284
|
+
@begun.should == 2
|
285
|
+
end
|
286
|
+
end
|
273
287
|
end
|
274
288
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
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.1
|
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-08-
|
11
|
+
date: 2013-08-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: ffi-compiler
|
@@ -94,7 +94,8 @@ files:
|
|
94
94
|
- spec/parser_spec.rb
|
95
95
|
- ext/Rakefile
|
96
96
|
homepage: https://github.com/cotag/http-parser
|
97
|
-
licenses:
|
97
|
+
licenses:
|
98
|
+
- MIT
|
98
99
|
metadata: {}
|
99
100
|
post_install_message:
|
100
101
|
rdoc_options: []
|