http_parser.rb 0.6.0 → 0.8.0
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 +5 -13
- data/.github/workflows/linux.yml +23 -0
- data/.github/workflows/windows.yml +23 -0
- data/.gitignore +5 -4
- data/.gitmodules +2 -2
- data/README.md +2 -2
- data/Rakefile +4 -2
- data/ext/ruby_http_parser/extconf.rb +1 -1
- data/ext/ruby_http_parser/org/ruby_http_parser/RubyHttpParser.java +8 -1
- data/ext/ruby_http_parser/ruby_http_parser.c +53 -7
- data/ext/ruby_http_parser/vendor/http-parser/AUTHORS +37 -1
- data/ext/ruby_http_parser/vendor/http-parser/LICENSE-MIT +1 -5
- data/ext/ruby_http_parser/vendor/http-parser/Makefile +110 -8
- data/ext/ruby_http_parser/vendor/http-parser/README.md +105 -37
- data/ext/ruby_http_parser/vendor/http-parser/bench.c +128 -0
- data/ext/ruby_http_parser/vendor/http-parser/contrib/parsertrace.c +157 -0
- data/ext/ruby_http_parser/vendor/http-parser/contrib/url_parser.c +47 -0
- data/ext/ruby_http_parser/vendor/http-parser/http_parser.c +892 -510
- data/ext/ruby_http_parser/vendor/http-parser/http_parser.gyp +34 -2
- data/ext/ruby_http_parser/vendor/http-parser/http_parser.h +198 -77
- data/ext/ruby_http_parser/vendor/http-parser/test.c +1781 -201
- data/http_parser.rb.gemspec +13 -9
- data/spec/parser_spec.rb +176 -98
- data/spec/support/requests.json +2 -2
- data/spec/support/responses.json +20 -0
- data/tasks/spec.rake +1 -1
- metadata +64 -63
- data/Gemfile.lock +0 -39
- data/ext/ruby_http_parser/vendor/http-parser/CONTRIBUTIONS +0 -4
checksums.yaml
CHANGED
@@ -1,15 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
|
5
|
-
data.tar.gz: !binary |-
|
6
|
-
YmVhZTVjYmMxNGM3YjUwOWQ3NmUwYzEwZThlZWM5NDQ0ZGMwYTgwNA==
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: cb02853976523252e0d5f36af3ba83b363010d4c163d9a4951b419054e7486ae
|
4
|
+
data.tar.gz: 3b7ac3ea5df5866582e0f68653d205764498e60e01835d2e19661cf4e1089d1b
|
7
5
|
SHA512:
|
8
|
-
metadata.gz:
|
9
|
-
|
10
|
-
OTUwOTk3ODYwZGJhNGIwMjA0Mjg1MTFkNDgxY2ZlMGIzZjQwNmQ1ODVkMjFj
|
11
|
-
ZjQyYzVmNjlkYTQ0NDZkMzhhYjE1M2FhZTdiOTdlYzAxMzljOWY=
|
12
|
-
data.tar.gz: !binary |-
|
13
|
-
M2ZiYTcwYTg2ZDJjZDc2N2Y0NzhmMzE0MzExNTY5M2I3MzAxMTkzNzUyYzUz
|
14
|
-
NGM2YzRmOGM3OGQ4NDNkMmIwYjM2MjYyMGJlNTU1MTVlNzFiYjgxZjJiYmNi
|
15
|
-
Y2Q4N2YyZWFjODYwYzlhNGMwMzcxNTcwZjIwMWJjNDViNjQ1MTc=
|
6
|
+
metadata.gz: 67516e3f1024e4bbf8dd00ae441646d53ca279313683b6f8da24668901c59b364608ecd9c69dab63709d9f89245ddc5363e0865f294a5af9d8e0b39d4712328f
|
7
|
+
data.tar.gz: 505a790706bc8f84404c2c6dd7e2b0025d591ca30311ca93d4eda4cf58a274c105acf68ed029ce96e38b04b040b86d4e953cf944a80a1e66a72f2a737d8cbfba
|
@@ -0,0 +1,23 @@
|
|
1
|
+
name: Testing on Ubuntu
|
2
|
+
on:
|
3
|
+
- push
|
4
|
+
- pull_request
|
5
|
+
jobs:
|
6
|
+
build:
|
7
|
+
runs-on: ${{ matrix.os }}
|
8
|
+
strategy:
|
9
|
+
fail-fast: false
|
10
|
+
matrix:
|
11
|
+
ruby: [ '2.6', '2.7', '3.0' ]
|
12
|
+
os: [ 'ubuntu-latest' ]
|
13
|
+
name: Ruby ${{ matrix.ruby }} unit testing on ${{ matrix.os }}
|
14
|
+
steps:
|
15
|
+
- uses: actions/checkout@v2
|
16
|
+
- uses: ruby/setup-ruby@v1
|
17
|
+
with:
|
18
|
+
ruby-version: ${{ matrix.ruby }}
|
19
|
+
- name: unit testing
|
20
|
+
run: |
|
21
|
+
gem install bundler rake
|
22
|
+
bundle install --jobs 4 --retry 3
|
23
|
+
bundle exec rake
|
@@ -0,0 +1,23 @@
|
|
1
|
+
name: Testing on Windows
|
2
|
+
on:
|
3
|
+
- push
|
4
|
+
- pull_request
|
5
|
+
jobs:
|
6
|
+
build:
|
7
|
+
runs-on: ${{ matrix.os }}
|
8
|
+
strategy:
|
9
|
+
fail-fast: false
|
10
|
+
matrix:
|
11
|
+
ruby: [ '2.6', '2.7', '3.0' ]
|
12
|
+
os: [ 'windows-latest' ]
|
13
|
+
name: Ruby ${{ matrix.ruby }} unit testing on ${{ matrix.os }}
|
14
|
+
steps:
|
15
|
+
- uses: actions/checkout@v2
|
16
|
+
- uses: ruby/setup-ruby@v1
|
17
|
+
with:
|
18
|
+
ruby-version: ${{ matrix.ruby }}
|
19
|
+
- name: unit testing
|
20
|
+
run: |
|
21
|
+
gem install bundler rake
|
22
|
+
bundle install --jobs 4 --retry 3
|
23
|
+
bundle exec rake
|
data/.gitignore
CHANGED
data/.gitmodules
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
[submodule "http-parser"]
|
2
2
|
path = ext/ruby_http_parser/vendor/http-parser
|
3
|
-
url =
|
3
|
+
url = https://github.com/nodejs/http-parser.git
|
4
4
|
[submodule "http-parser-java"]
|
5
5
|
path = ext/ruby_http_parser/vendor/http-parser-java
|
6
|
-
url =
|
6
|
+
url = https://github.com/tmm1/http-parser.java
|
data/README.md
CHANGED
@@ -3,13 +3,13 @@
|
|
3
3
|
A simple callback-based HTTP request/response parser for writing http
|
4
4
|
servers, clients and proxies.
|
5
5
|
|
6
|
-
This gem is built on top of [joyent/http-parser](
|
6
|
+
This gem is built on top of [joyent/http-parser](https://github.com/joyent/http-parser) and its java port [http-parser/http-parser.java](https://github.com/http-parser/http-parser.java).
|
7
7
|
|
8
8
|
## Supported Platforms
|
9
9
|
|
10
10
|
This gem aims to work on all major Ruby platforms, including:
|
11
11
|
|
12
|
-
- MRI 1.8 and
|
12
|
+
- MRI 1.8, 1.9 and 2.0; should work on MRI 2.4+
|
13
13
|
- Rubinius
|
14
14
|
- JRuby
|
15
15
|
- win32
|
data/Rakefile
CHANGED
@@ -8,6 +8,9 @@ import http_parser.lolevel.HTTPDataCallback;
|
|
8
8
|
import http_parser.lolevel.ParserSettings;
|
9
9
|
|
10
10
|
import java.nio.ByteBuffer;
|
11
|
+
import java.util.Arrays;
|
12
|
+
import java.util.ArrayList;
|
13
|
+
import java.util.List;
|
11
14
|
|
12
15
|
import org.jcodings.Encoding;
|
13
16
|
import org.jcodings.specific.UTF8Encoding;
|
@@ -81,6 +84,10 @@ public class RubyHttpParser extends RubyObject {
|
|
81
84
|
|
82
85
|
private static final Encoding UTF8 = UTF8Encoding.INSTANCE;
|
83
86
|
|
87
|
+
private static final List<String> VALUE_TYPES = new ArrayList<String>(
|
88
|
+
Arrays.asList("mixed", "arrays", "strings")
|
89
|
+
);
|
90
|
+
|
84
91
|
public RubyHttpParser(final Ruby runtime, RubyClass clazz) {
|
85
92
|
super(runtime, clazz);
|
86
93
|
|
@@ -474,7 +481,7 @@ public class RubyHttpParser extends RubyObject {
|
|
474
481
|
@JRubyMethod(name = "header_value_type=")
|
475
482
|
public IRubyObject set_header_value_type(IRubyObject val) {
|
476
483
|
String valString = val.toString();
|
477
|
-
if (valString
|
484
|
+
if (!VALUE_TYPES.contains(valString)) {
|
478
485
|
throw runtime.newArgumentError("Invalid header value type");
|
479
486
|
}
|
480
487
|
header_value_type = val;
|
@@ -16,6 +16,7 @@
|
|
16
16
|
typedef struct ParserWrapper {
|
17
17
|
ryah_http_parser parser;
|
18
18
|
|
19
|
+
VALUE status;
|
19
20
|
VALUE request_url;
|
20
21
|
|
21
22
|
VALUE headers;
|
@@ -45,6 +46,7 @@ void ParserWrapper_init(ParserWrapper *wrapper) {
|
|
45
46
|
wrapper->parser.http_major = 0;
|
46
47
|
wrapper->parser.http_minor = 0;
|
47
48
|
|
49
|
+
wrapper->status = Qnil;
|
48
50
|
wrapper->request_url = Qnil;
|
49
51
|
|
50
52
|
wrapper->upgrade_data = Qnil;
|
@@ -59,6 +61,7 @@ void ParserWrapper_init(ParserWrapper *wrapper) {
|
|
59
61
|
void ParserWrapper_mark(void *data) {
|
60
62
|
if(data) {
|
61
63
|
ParserWrapper *wrapper = (ParserWrapper *) data;
|
64
|
+
rb_gc_mark_maybe(wrapper->status);
|
62
65
|
rb_gc_mark_maybe(wrapper->request_url);
|
63
66
|
rb_gc_mark_maybe(wrapper->upgrade_data);
|
64
67
|
rb_gc_mark_maybe(wrapper->headers);
|
@@ -101,6 +104,7 @@ static VALUE Smixed;
|
|
101
104
|
int on_message_begin(ryah_http_parser *parser) {
|
102
105
|
GET_WRAPPER(wrapper, parser);
|
103
106
|
|
107
|
+
wrapper->status = rb_str_new2("");
|
104
108
|
wrapper->request_url = rb_str_new2("");
|
105
109
|
wrapper->headers = rb_hash_new();
|
106
110
|
wrapper->upgrade_data = rb_str_new2("");
|
@@ -121,9 +125,28 @@ int on_message_begin(ryah_http_parser *parser) {
|
|
121
125
|
}
|
122
126
|
}
|
123
127
|
|
128
|
+
int on_status(ryah_http_parser *parser, const char *at, size_t length) {
|
129
|
+
GET_WRAPPER(wrapper, parser);
|
130
|
+
|
131
|
+
if (at && length) {
|
132
|
+
if (wrapper->status == Qnil) {
|
133
|
+
wrapper->status = rb_str_new(at, length);
|
134
|
+
} else {
|
135
|
+
rb_str_cat(wrapper->status, at, length);
|
136
|
+
}
|
137
|
+
}
|
138
|
+
return 0;
|
139
|
+
}
|
140
|
+
|
124
141
|
int on_url(ryah_http_parser *parser, const char *at, size_t length) {
|
125
142
|
GET_WRAPPER(wrapper, parser);
|
126
|
-
|
143
|
+
if (at && length) {
|
144
|
+
if (wrapper->request_url == Qnil) {
|
145
|
+
wrapper->request_url = rb_str_new(at, length);
|
146
|
+
} else {
|
147
|
+
rb_str_cat(wrapper->request_url, at, length);
|
148
|
+
}
|
149
|
+
}
|
127
150
|
return 0;
|
128
151
|
}
|
129
152
|
|
@@ -136,7 +159,6 @@ int on_header_field(ryah_http_parser *parser, const char *at, size_t length) {
|
|
136
159
|
} else {
|
137
160
|
rb_str_cat(wrapper->curr_field_name, at, length);
|
138
161
|
}
|
139
|
-
|
140
162
|
return 0;
|
141
163
|
}
|
142
164
|
|
@@ -248,6 +270,7 @@ int on_message_complete(ryah_http_parser *parser) {
|
|
248
270
|
|
249
271
|
static ryah_http_parser_settings settings = {
|
250
272
|
.on_message_begin = on_message_begin,
|
273
|
+
.on_status = on_status,
|
251
274
|
.on_url = on_url,
|
252
275
|
.on_header_field = on_header_field,
|
253
276
|
.on_header_value = on_header_value,
|
@@ -293,7 +316,17 @@ VALUE Parser_initialize(int argc, VALUE *argv, VALUE self) {
|
|
293
316
|
ParserWrapper *wrapper = NULL;
|
294
317
|
DATA_GET(self, ParserWrapper, wrapper);
|
295
318
|
|
296
|
-
|
319
|
+
VALUE default_header_value_type = Qnil;
|
320
|
+
|
321
|
+
if (argc > 0 && RB_TYPE_P(argv[argc-1], T_HASH)) {
|
322
|
+
ID keyword_ids[1];
|
323
|
+
keyword_ids[0] = rb_intern("default_header_value_type");
|
324
|
+
rb_get_kwargs(argv[argc-1], keyword_ids, 0, 1, &default_header_value_type);
|
325
|
+
if (default_header_value_type == Qundef) {
|
326
|
+
default_header_value_type = Qnil;
|
327
|
+
}
|
328
|
+
--argc;
|
329
|
+
}
|
297
330
|
|
298
331
|
if (argc == 1) {
|
299
332
|
wrapper->callback_object = argv[0];
|
@@ -301,7 +334,13 @@ VALUE Parser_initialize(int argc, VALUE *argv, VALUE self) {
|
|
301
334
|
|
302
335
|
if (argc == 2) {
|
303
336
|
wrapper->callback_object = argv[0];
|
304
|
-
|
337
|
+
default_header_value_type = argv[1];
|
338
|
+
}
|
339
|
+
|
340
|
+
if (default_header_value_type == Qnil) {
|
341
|
+
wrapper->header_value_type = rb_iv_get(CLASS_OF(self), "@default_header_value_type");
|
342
|
+
} else {
|
343
|
+
wrapper->header_value_type = default_header_value_type;
|
305
344
|
}
|
306
345
|
|
307
346
|
return self;
|
@@ -320,11 +359,12 @@ VALUE Parser_execute(VALUE self, VALUE data) {
|
|
320
359
|
size_t nparsed = ryah_http_parser_execute(&wrapper->parser, &settings, ptr, len);
|
321
360
|
|
322
361
|
if (wrapper->parser.upgrade) {
|
323
|
-
if (RTEST(wrapper->stopped))
|
362
|
+
if (RTEST(wrapper->stopped) && !RTEST(wrapper->completed))
|
324
363
|
nparsed += 1;
|
325
364
|
|
326
|
-
|
327
|
-
|
365
|
+
if (nparsed < len)
|
366
|
+
rb_str_cat(wrapper->upgrade_data, ptr + nparsed, len - nparsed);
|
367
|
+
|
328
368
|
} else if (nparsed != (size_t)len) {
|
329
369
|
if (!RTEST(wrapper->stopped) && !RTEST(wrapper->completed))
|
330
370
|
rb_raise(eParserError, "Could not parse data entirely (%zu != %zu)", nparsed, len);
|
@@ -438,6 +478,7 @@ VALUE Parser_status_code(VALUE self) {
|
|
438
478
|
return wrapper->name; \
|
439
479
|
}
|
440
480
|
|
481
|
+
DEFINE_GETTER(status);
|
441
482
|
DEFINE_GETTER(request_url);
|
442
483
|
DEFINE_GETTER(headers);
|
443
484
|
DEFINE_GETTER(upgrade_data);
|
@@ -464,6 +505,10 @@ VALUE Parser_reset(VALUE self) {
|
|
464
505
|
}
|
465
506
|
|
466
507
|
void Init_ruby_http_parser() {
|
508
|
+
#ifdef HAVE_RB_EXT_RACTOR_SAFE
|
509
|
+
rb_ext_ractor_safe(true);
|
510
|
+
#endif
|
511
|
+
|
467
512
|
VALUE mHTTP = rb_define_module("HTTP");
|
468
513
|
cParser = rb_define_class_under(mHTTP, "Parser", rb_cObject);
|
469
514
|
cRequestParser = rb_define_class_under(mHTTP, "RequestParser", cParser);
|
@@ -505,6 +550,7 @@ void Init_ruby_http_parser() {
|
|
505
550
|
rb_define_method(cParser, "http_method", Parser_http_method, 0);
|
506
551
|
rb_define_method(cParser, "status_code", Parser_status_code, 0);
|
507
552
|
|
553
|
+
rb_define_method(cParser, "status", Parser_status, 0);
|
508
554
|
rb_define_method(cParser, "request_url", Parser_request_url, 0);
|
509
555
|
rb_define_method(cParser, "headers", Parser_headers, 0);
|
510
556
|
rb_define_method(cParser, "upgrade_data", Parser_upgrade_data, 0);
|
@@ -28,5 +28,41 @@ Andre Caron <andre.l.caron@gmail.com>
|
|
28
28
|
Ivo Raisr <ivosh@ivosh.net>
|
29
29
|
James McLaughlin <jamie@lacewing-project.org>
|
30
30
|
David Gwynne <loki@animata.net>
|
31
|
-
LE ROUX
|
31
|
+
Thomas LE ROUX <thomas@november-eleven.fr>
|
32
32
|
Randy Rizun <rrizun@ortivawireless.com>
|
33
|
+
Andre Louis Caron <andre.louis.caron@usherbrooke.ca>
|
34
|
+
Simon Zimmermann <simonz05@gmail.com>
|
35
|
+
Erik Dubbelboer <erik@dubbelboer.com>
|
36
|
+
Martell Malone <martellmalone@gmail.com>
|
37
|
+
Bertrand Paquet <bpaquet@octo.com>
|
38
|
+
BogDan Vatra <bogdan@kde.org>
|
39
|
+
Peter Faiman <peter@thepicard.org>
|
40
|
+
Corey Richardson <corey@octayn.net>
|
41
|
+
Tóth Tamás <tomika_nospam@freemail.hu>
|
42
|
+
Cam Swords <cam.swords@gmail.com>
|
43
|
+
Chris Dickinson <christopher.s.dickinson@gmail.com>
|
44
|
+
Uli Köhler <ukoehler@btronik.de>
|
45
|
+
Charlie Somerville <charlie@charliesomerville.com>
|
46
|
+
Patrik Stutz <patrik.stutz@gmail.com>
|
47
|
+
Fedor Indutny <fedor.indutny@gmail.com>
|
48
|
+
runner <runner.mei@gmail.com>
|
49
|
+
Alexis Campailla <alexis@janeasystems.com>
|
50
|
+
David Wragg <david@wragg.org>
|
51
|
+
Vinnie Falco <vinnie.falco@gmail.com>
|
52
|
+
Alex Butum <alexbutum@linux.com>
|
53
|
+
Rex Feng <rexfeng@gmail.com>
|
54
|
+
Alex Kocharin <alex@kocharin.ru>
|
55
|
+
Mark Koopman <markmontymark@yahoo.com>
|
56
|
+
Helge Heß <me@helgehess.eu>
|
57
|
+
Alexis La Goutte <alexis.lagoutte@gmail.com>
|
58
|
+
George Miroshnykov <george.miroshnykov@gmail.com>
|
59
|
+
Maciej Małecki <me@mmalecki.com>
|
60
|
+
Marc O'Morain <github.com@marcomorain.com>
|
61
|
+
Jeff Pinner <jpinner@twitter.com>
|
62
|
+
Timothy J Fontaine <tjfontaine@gmail.com>
|
63
|
+
Akagi201 <akagi201@gmail.com>
|
64
|
+
Romain Giraud <giraud.romain@gmail.com>
|
65
|
+
Jay Satiro <raysatiro@yahoo.com>
|
66
|
+
Arne Steen <Arne.Steen@gmx.de>
|
67
|
+
Kjell Schubert <kjell.schubert@gmail.com>
|
68
|
+
Olivier Mengué <dolmen@cpan.org>
|
@@ -1,8 +1,4 @@
|
|
1
|
-
|
2
|
-
Igor Sysoev.
|
3
|
-
|
4
|
-
Additional changes are licensed under the same terms as NGINX and
|
5
|
-
copyright Joyent, Inc. and other Node contributors. All rights reserved.
|
1
|
+
Copyright Joyent, Inc. and other Node contributors.
|
6
2
|
|
7
3
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
8
4
|
of this software and associated documentation files (the "Software"), to
|
@@ -1,20 +1,80 @@
|
|
1
|
+
# Copyright Joyent, Inc. and other Node contributors. All rights reserved.
|
2
|
+
#
|
3
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
4
|
+
# of this software and associated documentation files (the "Software"), to
|
5
|
+
# deal in the Software without restriction, including without limitation the
|
6
|
+
# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
7
|
+
# sell copies of the Software, and to permit persons to whom the Software is
|
8
|
+
# furnished to do so, subject to the following conditions:
|
9
|
+
#
|
10
|
+
# The above copyright notice and this permission notice shall be included in
|
11
|
+
# all copies or substantial portions of the Software.
|
12
|
+
#
|
13
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
14
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
15
|
+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
16
|
+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
17
|
+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
18
|
+
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
19
|
+
# IN THE SOFTWARE.
|
20
|
+
|
21
|
+
PLATFORM ?= $(shell sh -c 'uname -s | tr "[A-Z]" "[a-z]"')
|
22
|
+
HELPER ?=
|
23
|
+
BINEXT ?=
|
24
|
+
SOLIBNAME = libhttp_parser
|
25
|
+
SOMAJOR = 2
|
26
|
+
SOMINOR = 8
|
27
|
+
SOREV = 1
|
28
|
+
ifeq (darwin,$(PLATFORM))
|
29
|
+
SOEXT ?= dylib
|
30
|
+
SONAME ?= $(SOLIBNAME).$(SOMAJOR).$(SOMINOR).$(SOEXT)
|
31
|
+
LIBNAME ?= $(SOLIBNAME).$(SOMAJOR).$(SOMINOR).$(SOREV).$(SOEXT)
|
32
|
+
else ifeq (wine,$(PLATFORM))
|
33
|
+
CC = winegcc
|
34
|
+
BINEXT = .exe.so
|
35
|
+
HELPER = wine
|
36
|
+
else
|
37
|
+
SOEXT ?= so
|
38
|
+
SONAME ?= $(SOLIBNAME).$(SOEXT).$(SOMAJOR).$(SOMINOR)
|
39
|
+
LIBNAME ?= $(SOLIBNAME).$(SOEXT).$(SOMAJOR).$(SOMINOR).$(SOREV)
|
40
|
+
endif
|
41
|
+
|
1
42
|
CC?=gcc
|
2
43
|
AR?=ar
|
3
44
|
|
45
|
+
CPPFLAGS ?=
|
46
|
+
LDFLAGS ?=
|
47
|
+
|
4
48
|
CPPFLAGS += -I.
|
5
|
-
CPPFLAGS_DEBUG = $(CPPFLAGS) -DHTTP_PARSER_STRICT=1
|
49
|
+
CPPFLAGS_DEBUG = $(CPPFLAGS) -DHTTP_PARSER_STRICT=1
|
6
50
|
CPPFLAGS_DEBUG += $(CPPFLAGS_DEBUG_EXTRA)
|
7
|
-
CPPFLAGS_FAST = $(CPPFLAGS) -DHTTP_PARSER_STRICT=0
|
51
|
+
CPPFLAGS_FAST = $(CPPFLAGS) -DHTTP_PARSER_STRICT=0
|
8
52
|
CPPFLAGS_FAST += $(CPPFLAGS_FAST_EXTRA)
|
53
|
+
CPPFLAGS_BENCH = $(CPPFLAGS_FAST)
|
9
54
|
|
10
55
|
CFLAGS += -Wall -Wextra -Werror
|
11
56
|
CFLAGS_DEBUG = $(CFLAGS) -O0 -g $(CFLAGS_DEBUG_EXTRA)
|
12
57
|
CFLAGS_FAST = $(CFLAGS) -O3 $(CFLAGS_FAST_EXTRA)
|
58
|
+
CFLAGS_BENCH = $(CFLAGS_FAST) -Wno-unused-parameter
|
13
59
|
CFLAGS_LIB = $(CFLAGS_FAST) -fPIC
|
14
60
|
|
61
|
+
LDFLAGS_LIB = $(LDFLAGS) -shared
|
62
|
+
|
63
|
+
INSTALL ?= install
|
64
|
+
PREFIX ?= /usr/local
|
65
|
+
LIBDIR = $(PREFIX)/lib
|
66
|
+
INCLUDEDIR = $(PREFIX)/include
|
67
|
+
|
68
|
+
ifeq (darwin,$(PLATFORM))
|
69
|
+
LDFLAGS_LIB += -Wl,-install_name,$(LIBDIR)/$(SONAME)
|
70
|
+
else
|
71
|
+
# TODO(bnoordhuis) The native SunOS linker expects -h rather than -soname...
|
72
|
+
LDFLAGS_LIB += -Wl,-soname=$(SONAME)
|
73
|
+
endif
|
74
|
+
|
15
75
|
test: test_g test_fast
|
16
|
-
./test_g
|
17
|
-
./test_fast
|
76
|
+
$(HELPER) ./test_g$(BINEXT)
|
77
|
+
$(HELPER) ./test_fast$(BINEXT)
|
18
78
|
|
19
79
|
test_g: http_parser_g.o test_g.o
|
20
80
|
$(CC) $(CFLAGS_DEBUG) $(LDFLAGS) http_parser_g.o test_g.o -o $@
|
@@ -31,11 +91,17 @@ test_fast: http_parser.o test.o http_parser.h
|
|
31
91
|
test.o: test.c http_parser.h Makefile
|
32
92
|
$(CC) $(CPPFLAGS_FAST) $(CFLAGS_FAST) -c test.c -o $@
|
33
93
|
|
94
|
+
bench: http_parser.o bench.o
|
95
|
+
$(CC) $(CFLAGS_BENCH) $(LDFLAGS) http_parser.o bench.o -o $@
|
96
|
+
|
97
|
+
bench.o: bench.c http_parser.h Makefile
|
98
|
+
$(CC) $(CPPFLAGS_BENCH) $(CFLAGS_BENCH) -c bench.c -o $@
|
99
|
+
|
34
100
|
http_parser.o: http_parser.c http_parser.h Makefile
|
35
101
|
$(CC) $(CPPFLAGS_FAST) $(CFLAGS_FAST) -c http_parser.c
|
36
102
|
|
37
103
|
test-run-timed: test_fast
|
38
|
-
while(true) do time ./test_fast > /dev/null; done
|
104
|
+
while(true) do time $(HELPER) ./test_fast$(BINEXT) > /dev/null; done
|
39
105
|
|
40
106
|
test-valgrind: test_g
|
41
107
|
valgrind ./test_g
|
@@ -44,15 +110,51 @@ libhttp_parser.o: http_parser.c http_parser.h Makefile
|
|
44
110
|
$(CC) $(CPPFLAGS_FAST) $(CFLAGS_LIB) -c http_parser.c -o libhttp_parser.o
|
45
111
|
|
46
112
|
library: libhttp_parser.o
|
47
|
-
$(CC)
|
113
|
+
$(CC) $(LDFLAGS_LIB) -o $(LIBNAME) $<
|
48
114
|
|
49
115
|
package: http_parser.o
|
50
116
|
$(AR) rcs libhttp_parser.a http_parser.o
|
51
117
|
|
118
|
+
url_parser: http_parser.o contrib/url_parser.c
|
119
|
+
$(CC) $(CPPFLAGS_FAST) $(CFLAGS_FAST) $^ -o $@
|
120
|
+
|
121
|
+
url_parser_g: http_parser_g.o contrib/url_parser.c
|
122
|
+
$(CC) $(CPPFLAGS_DEBUG) $(CFLAGS_DEBUG) $^ -o $@
|
123
|
+
|
124
|
+
parsertrace: http_parser.o contrib/parsertrace.c
|
125
|
+
$(CC) $(CPPFLAGS_FAST) $(CFLAGS_FAST) $^ -o parsertrace$(BINEXT)
|
126
|
+
|
127
|
+
parsertrace_g: http_parser_g.o contrib/parsertrace.c
|
128
|
+
$(CC) $(CPPFLAGS_DEBUG) $(CFLAGS_DEBUG) $^ -o parsertrace_g$(BINEXT)
|
129
|
+
|
52
130
|
tags: http_parser.c http_parser.h test.c
|
53
131
|
ctags $^
|
54
132
|
|
133
|
+
install: library
|
134
|
+
$(INSTALL) -D http_parser.h $(DESTDIR)$(INCLUDEDIR)/http_parser.h
|
135
|
+
$(INSTALL) -D $(LIBNAME) $(DESTDIR)$(LIBDIR)/$(LIBNAME)
|
136
|
+
ln -s $(LIBNAME) $(DESTDIR)$(LIBDIR)/$(SONAME)
|
137
|
+
ln -s $(LIBNAME) $(DESTDIR)$(LIBDIR)/$(SOLIBNAME).$(SOEXT)
|
138
|
+
|
139
|
+
install-strip: library
|
140
|
+
$(INSTALL) -D http_parser.h $(DESTDIR)$(INCLUDEDIR)/http_parser.h
|
141
|
+
$(INSTALL) -D -s $(LIBNAME) $(DESTDIR)$(LIBDIR)/$(LIBNAME)
|
142
|
+
ln -s $(LIBNAME) $(DESTDIR)$(LIBDIR)/$(SONAME)
|
143
|
+
ln -s $(LIBNAME) $(DESTDIR)$(LIBDIR)/$(SOLIBNAME).$(SOEXT)
|
144
|
+
|
145
|
+
uninstall:
|
146
|
+
rm $(DESTDIR)$(INCLUDEDIR)/http_parser.h
|
147
|
+
rm $(DESTDIR)$(LIBDIR)/$(SOLIBNAME).$(SOEXT)
|
148
|
+
rm $(DESTDIR)$(LIBDIR)/$(SONAME)
|
149
|
+
rm $(DESTDIR)$(LIBDIR)/$(LIBNAME)
|
150
|
+
|
55
151
|
clean:
|
56
|
-
rm -f *.o *.a test test_fast test_g
|
152
|
+
rm -f *.o *.a tags test test_fast test_g \
|
153
|
+
http_parser.tar libhttp_parser.so.* \
|
154
|
+
url_parser url_parser_g parsertrace parsertrace_g \
|
155
|
+
*.exe *.exe.so
|
156
|
+
|
157
|
+
contrib/url_parser.c: http_parser.h
|
158
|
+
contrib/parsertrace.c: http_parser.h
|
57
159
|
|
58
|
-
.PHONY: clean package test-run test-run-timed test-valgrind
|
160
|
+
.PHONY: clean package test-run test-run-timed test-valgrind install install-strip uninstall
|