llhttp-ffi 0.0.1 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +6 -0
- data/ext/llhttp/api.c +73 -0
- data/ext/llhttp/llhttp.c +79 -24
- data/ext/llhttp/llhttp.h +74 -5
- data/lib/llhttp/version.rb +1 -1
- metadata +2 -7
- data/ext/x86_64-darwin/libllhttp-ext.bundle +0 -0
- data/ext/x86_64-darwin/llhttp/api.o +0 -0
- data/ext/x86_64-darwin/llhttp/http.o +0 -0
- data/ext/x86_64-darwin/llhttp/llhttp.o +0 -0
- data/ext/x86_64-darwin/llhttp/llhttp_ext.o +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d94d37a52b76098822327cd0c1846f919a9598cdb7dcd84d9c9545708932e269
|
4
|
+
data.tar.gz: 945819b2b1ac223cb0c417b969a682ee300368214d4b93357ee876ffcc20abaf
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8686cc40ffb08c4934c27b6c0450ca149f30ab7d0402b5f94529e10e0fc73e52492dcc437ed90ae8a4388f29d63132e41313c46218d76ea8c350f16980571828
|
7
|
+
data.tar.gz: 6322ed1aee6023e023b502a4dd8248d0b9b1152a886a056d5813d6944f61a8a66fa699c9c585cc4c7e46cb38cc1c08811f336ec59ad1832eb38b1d9cad22f802
|
data/CHANGELOG.md
CHANGED
data/ext/llhttp/api.c
CHANGED
@@ -47,6 +47,70 @@ void llhttp_init(llhttp_t* parser, llhttp_type_t type,
|
|
47
47
|
}
|
48
48
|
|
49
49
|
|
50
|
+
#if defined(__wasm__)
|
51
|
+
|
52
|
+
extern int wasm_on_message_begin(llhttp_t * p);
|
53
|
+
extern int wasm_on_url(llhttp_t* p, const char* at, size_t length);
|
54
|
+
extern int wasm_on_status(llhttp_t* p, const char* at, size_t length);
|
55
|
+
extern int wasm_on_header_field(llhttp_t* p, const char* at, size_t length);
|
56
|
+
extern int wasm_on_header_value(llhttp_t* p, const char* at, size_t length);
|
57
|
+
extern int wasm_on_headers_complete(llhttp_t * p);
|
58
|
+
extern int wasm_on_body(llhttp_t* p, const char* at, size_t length);
|
59
|
+
extern int wasm_on_message_complete(llhttp_t * p);
|
60
|
+
|
61
|
+
const llhttp_settings_t wasm_settings = {
|
62
|
+
wasm_on_message_begin,
|
63
|
+
wasm_on_url,
|
64
|
+
wasm_on_status,
|
65
|
+
wasm_on_header_field,
|
66
|
+
wasm_on_header_value,
|
67
|
+
wasm_on_headers_complete,
|
68
|
+
wasm_on_body,
|
69
|
+
wasm_on_message_complete,
|
70
|
+
NULL,
|
71
|
+
NULL,
|
72
|
+
};
|
73
|
+
|
74
|
+
|
75
|
+
llhttp_t* llhttp_alloc(llhttp_type_t type) {
|
76
|
+
llhttp_t* parser = malloc(sizeof(llhttp_t));
|
77
|
+
llhttp_init(parser, type, &wasm_settings);
|
78
|
+
return parser;
|
79
|
+
}
|
80
|
+
|
81
|
+
void llhttp_free(llhttp_t* parser) {
|
82
|
+
free(parser);
|
83
|
+
}
|
84
|
+
|
85
|
+
/* Some getters required to get stuff from the parser */
|
86
|
+
|
87
|
+
uint8_t llhttp_get_type(llhttp_t* parser) {
|
88
|
+
return parser->type;
|
89
|
+
}
|
90
|
+
|
91
|
+
uint8_t llhttp_get_http_major(llhttp_t* parser) {
|
92
|
+
return parser->http_major;
|
93
|
+
}
|
94
|
+
|
95
|
+
uint8_t llhttp_get_http_minor(llhttp_t* parser) {
|
96
|
+
return parser->http_minor;
|
97
|
+
}
|
98
|
+
|
99
|
+
uint8_t llhttp_get_method(llhttp_t* parser) {
|
100
|
+
return parser->method;
|
101
|
+
}
|
102
|
+
|
103
|
+
int llhttp_get_status_code(llhttp_t* parser) {
|
104
|
+
return parser->status_code;
|
105
|
+
}
|
106
|
+
|
107
|
+
uint8_t llhttp_get_upgrade(llhttp_t* parser) {
|
108
|
+
return parser->upgrade;
|
109
|
+
}
|
110
|
+
|
111
|
+
#endif // defined(__wasm__)
|
112
|
+
|
113
|
+
|
50
114
|
void llhttp_reset(llhttp_t* parser) {
|
51
115
|
llhttp_type_t type = parser->type;
|
52
116
|
const llhttp_settings_t* settings = parser->settings;
|
@@ -173,6 +237,7 @@ void llhttp_set_lenient_headers(llhttp_t* parser, int enabled) {
|
|
173
237
|
}
|
174
238
|
}
|
175
239
|
|
240
|
+
|
176
241
|
void llhttp_set_lenient_chunked_length(llhttp_t* parser, int enabled) {
|
177
242
|
if (enabled) {
|
178
243
|
parser->lenient_flags |= LENIENT_CHUNKED_LENGTH;
|
@@ -182,6 +247,14 @@ void llhttp_set_lenient_chunked_length(llhttp_t* parser, int enabled) {
|
|
182
247
|
}
|
183
248
|
|
184
249
|
|
250
|
+
void llhttp_set_lenient_keep_alive(llhttp_t* parser, int enabled) {
|
251
|
+
if (enabled) {
|
252
|
+
parser->lenient_flags |= LENIENT_KEEP_ALIVE;
|
253
|
+
} else {
|
254
|
+
parser->lenient_flags &= ~LENIENT_KEEP_ALIVE;
|
255
|
+
}
|
256
|
+
}
|
257
|
+
|
185
258
|
/* Callbacks */
|
186
259
|
|
187
260
|
|
data/ext/llhttp/llhttp.c
CHANGED
@@ -650,6 +650,13 @@ int llhttp__internal__c_update_finish_1(
|
|
650
650
|
return 0;
|
651
651
|
}
|
652
652
|
|
653
|
+
int llhttp__internal__c_test_lenient_flags(
|
654
|
+
llhttp__internal_t* state,
|
655
|
+
const unsigned char* p,
|
656
|
+
const unsigned char* endp) {
|
657
|
+
return (state->lenient_flags & 4) == 4;
|
658
|
+
}
|
659
|
+
|
653
660
|
int llhttp__internal__c_test_flags_1(
|
654
661
|
llhttp__internal_t* state,
|
655
662
|
const unsigned char* p,
|
@@ -657,7 +664,7 @@ int llhttp__internal__c_test_flags_1(
|
|
657
664
|
return (state->flags & 544) == 544;
|
658
665
|
}
|
659
666
|
|
660
|
-
int
|
667
|
+
int llhttp__internal__c_test_lenient_flags_1(
|
661
668
|
llhttp__internal_t* state,
|
662
669
|
const unsigned char* p,
|
663
670
|
const unsigned char* endp) {
|
@@ -825,7 +832,7 @@ int llhttp__internal__c_update_header_state_2(
|
|
825
832
|
return 0;
|
826
833
|
}
|
827
834
|
|
828
|
-
int
|
835
|
+
int llhttp__internal__c_test_lenient_flags_2(
|
829
836
|
llhttp__internal_t* state,
|
830
837
|
const unsigned char* p,
|
831
838
|
const unsigned char* endp) {
|
@@ -1684,7 +1691,7 @@ static llparse_state_t llhttp__internal__run(
|
|
1684
1691
|
goto s_n_llhttp__internal__n_span_end_llhttp__on_header_value_2;
|
1685
1692
|
}
|
1686
1693
|
default: {
|
1687
|
-
goto
|
1694
|
+
goto s_n_llhttp__internal__n_invoke_test_lenient_flags_2;
|
1688
1695
|
}
|
1689
1696
|
}
|
1690
1697
|
/* UNREACHABLE */;
|
@@ -5756,10 +5763,20 @@ static llparse_state_t llhttp__internal__run(
|
|
5756
5763
|
/* UNREACHABLE */;
|
5757
5764
|
abort();
|
5758
5765
|
}
|
5766
|
+
s_n_llhttp__internal__n_invoke_test_lenient_flags: {
|
5767
|
+
switch (llhttp__internal__c_test_lenient_flags(state, p, endp)) {
|
5768
|
+
case 1:
|
5769
|
+
goto s_n_llhttp__internal__n_invoke_update_finish_2;
|
5770
|
+
default:
|
5771
|
+
goto s_n_llhttp__internal__n_closed;
|
5772
|
+
}
|
5773
|
+
/* UNREACHABLE */;
|
5774
|
+
abort();
|
5775
|
+
}
|
5759
5776
|
s_n_llhttp__internal__n_invoke_update_finish_1: {
|
5760
5777
|
switch (llhttp__internal__c_update_finish_1(state, p, endp)) {
|
5761
5778
|
default:
|
5762
|
-
goto
|
5779
|
+
goto s_n_llhttp__internal__n_invoke_test_lenient_flags;
|
5763
5780
|
}
|
5764
5781
|
/* UNREACHABLE */;
|
5765
5782
|
abort();
|
@@ -6121,8 +6138,8 @@ static llparse_state_t llhttp__internal__run(
|
|
6121
6138
|
/* UNREACHABLE */;
|
6122
6139
|
abort();
|
6123
6140
|
}
|
6124
|
-
|
6125
|
-
switch (
|
6141
|
+
s_n_llhttp__internal__n_invoke_test_lenient_flags_1: {
|
6142
|
+
switch (llhttp__internal__c_test_lenient_flags_1(state, p, endp)) {
|
6126
6143
|
case 0:
|
6127
6144
|
goto s_n_llhttp__internal__n_error_15;
|
6128
6145
|
default:
|
@@ -6134,7 +6151,7 @@ static llparse_state_t llhttp__internal__run(
|
|
6134
6151
|
s_n_llhttp__internal__n_invoke_test_flags_1: {
|
6135
6152
|
switch (llhttp__internal__c_test_flags_1(state, p, endp)) {
|
6136
6153
|
case 1:
|
6137
|
-
goto
|
6154
|
+
goto s_n_llhttp__internal__n_invoke_test_lenient_flags_1;
|
6138
6155
|
default:
|
6139
6156
|
goto s_n_llhttp__internal__n_invoke_llhttp__before_headers_complete;
|
6140
6157
|
}
|
@@ -6388,8 +6405,8 @@ static llparse_state_t llhttp__internal__run(
|
|
6388
6405
|
/* UNREACHABLE */;
|
6389
6406
|
abort();
|
6390
6407
|
}
|
6391
|
-
|
6392
|
-
switch (
|
6408
|
+
s_n_llhttp__internal__n_invoke_test_lenient_flags_2: {
|
6409
|
+
switch (llhttp__internal__c_test_lenient_flags_2(state, p, endp)) {
|
6393
6410
|
case 1:
|
6394
6411
|
goto s_n_llhttp__internal__n_header_value_lenient;
|
6395
6412
|
default:
|
@@ -6750,7 +6767,7 @@ static llparse_state_t llhttp__internal__run(
|
|
6750
6767
|
abort();
|
6751
6768
|
}
|
6752
6769
|
s_n_llhttp__internal__n_error_29: {
|
6753
|
-
state->error =
|
6770
|
+
state->error = 0x17;
|
6754
6771
|
state->reason = "Pause on PRI/Upgrade";
|
6755
6772
|
state->error_pos = (const char*) p;
|
6756
6773
|
state->_current = (void*) (intptr_t) s_error;
|
@@ -7929,6 +7946,7 @@ reset:
|
|
7929
7946
|
|
7930
7947
|
enum llparse_state_e {
|
7931
7948
|
s_error,
|
7949
|
+
s_n_llhttp__internal__n_closed,
|
7932
7950
|
s_n_llhttp__internal__n_invoke_llhttp__after_message_complete,
|
7933
7951
|
s_n_llhttp__internal__n_pause_1,
|
7934
7952
|
s_n_llhttp__internal__n_invoke_is_equal_upgrade,
|
@@ -8222,6 +8240,13 @@ int llhttp__internal__c_update_finish_1(
|
|
8222
8240
|
return 0;
|
8223
8241
|
}
|
8224
8242
|
|
8243
|
+
int llhttp__internal__c_test_lenient_flags(
|
8244
|
+
llhttp__internal_t* state,
|
8245
|
+
const unsigned char* p,
|
8246
|
+
const unsigned char* endp) {
|
8247
|
+
return (state->lenient_flags & 4) == 4;
|
8248
|
+
}
|
8249
|
+
|
8225
8250
|
int llhttp__internal__c_test_flags_1(
|
8226
8251
|
llhttp__internal_t* state,
|
8227
8252
|
const unsigned char* p,
|
@@ -8229,7 +8254,7 @@ int llhttp__internal__c_test_flags_1(
|
|
8229
8254
|
return (state->flags & 544) == 544;
|
8230
8255
|
}
|
8231
8256
|
|
8232
|
-
int
|
8257
|
+
int llhttp__internal__c_test_lenient_flags_1(
|
8233
8258
|
llhttp__internal_t* state,
|
8234
8259
|
const unsigned char* p,
|
8235
8260
|
const unsigned char* endp) {
|
@@ -8301,7 +8326,7 @@ int llhttp__internal__c_or_flags(
|
|
8301
8326
|
return 0;
|
8302
8327
|
}
|
8303
8328
|
|
8304
|
-
int
|
8329
|
+
int llhttp__internal__c_update_finish_3(
|
8305
8330
|
llhttp__internal_t* state,
|
8306
8331
|
const unsigned char* p,
|
8307
8332
|
const unsigned char* endp) {
|
@@ -8397,7 +8422,7 @@ int llhttp__internal__c_update_header_state_2(
|
|
8397
8422
|
return 0;
|
8398
8423
|
}
|
8399
8424
|
|
8400
|
-
int
|
8425
|
+
int llhttp__internal__c_test_lenient_flags_2(
|
8401
8426
|
llhttp__internal_t* state,
|
8402
8427
|
const unsigned char* p,
|
8403
8428
|
const unsigned char* endp) {
|
@@ -8597,9 +8622,21 @@ static llparse_state_t llhttp__internal__run(
|
|
8597
8622
|
const unsigned char* endp) {
|
8598
8623
|
int match;
|
8599
8624
|
switch ((llparse_state_t) (intptr_t) state->_current) {
|
8625
|
+
case s_n_llhttp__internal__n_closed:
|
8626
|
+
s_n_llhttp__internal__n_closed: {
|
8627
|
+
if (p == endp) {
|
8628
|
+
return s_n_llhttp__internal__n_closed;
|
8629
|
+
}
|
8630
|
+
p++;
|
8631
|
+
goto s_n_llhttp__internal__n_closed;
|
8632
|
+
/* UNREACHABLE */;
|
8633
|
+
abort();
|
8634
|
+
}
|
8600
8635
|
case s_n_llhttp__internal__n_invoke_llhttp__after_message_complete:
|
8601
8636
|
s_n_llhttp__internal__n_invoke_llhttp__after_message_complete: {
|
8602
8637
|
switch (llhttp__after_message_complete(state, p, endp)) {
|
8638
|
+
case 1:
|
8639
|
+
goto s_n_llhttp__internal__n_invoke_update_finish_2;
|
8603
8640
|
default:
|
8604
8641
|
goto s_n_llhttp__internal__n_invoke_update_finish_1;
|
8605
8642
|
}
|
@@ -9068,7 +9105,7 @@ static llparse_state_t llhttp__internal__run(
|
|
9068
9105
|
case 3:
|
9069
9106
|
goto s_n_llhttp__internal__n_span_start_llhttp__on_body_1;
|
9070
9107
|
case 4:
|
9071
|
-
goto
|
9108
|
+
goto s_n_llhttp__internal__n_invoke_update_finish_3;
|
9072
9109
|
case 5:
|
9073
9110
|
goto s_n_llhttp__internal__n_error_10;
|
9074
9111
|
default:
|
@@ -9207,7 +9244,7 @@ static llparse_state_t llhttp__internal__run(
|
|
9207
9244
|
goto s_n_llhttp__internal__n_span_end_llhttp__on_header_value_2;
|
9208
9245
|
}
|
9209
9246
|
default: {
|
9210
|
-
goto
|
9247
|
+
goto s_n_llhttp__internal__n_invoke_test_lenient_flags_2;
|
9211
9248
|
}
|
9212
9249
|
}
|
9213
9250
|
/* UNREACHABLE */;
|
@@ -13100,7 +13137,7 @@ static llparse_state_t llhttp__internal__run(
|
|
13100
13137
|
/* UNREACHABLE */;
|
13101
13138
|
abort();
|
13102
13139
|
}
|
13103
|
-
|
13140
|
+
s_n_llhttp__internal__n_invoke_update_finish_2: {
|
13104
13141
|
switch (llhttp__internal__c_update_finish_1(state, p, endp)) {
|
13105
13142
|
default:
|
13106
13143
|
goto s_n_llhttp__internal__n_start;
|
@@ -13108,6 +13145,24 @@ static llparse_state_t llhttp__internal__run(
|
|
13108
13145
|
/* UNREACHABLE */;
|
13109
13146
|
abort();
|
13110
13147
|
}
|
13148
|
+
s_n_llhttp__internal__n_invoke_test_lenient_flags: {
|
13149
|
+
switch (llhttp__internal__c_test_lenient_flags(state, p, endp)) {
|
13150
|
+
case 1:
|
13151
|
+
goto s_n_llhttp__internal__n_invoke_update_finish_2;
|
13152
|
+
default:
|
13153
|
+
goto s_n_llhttp__internal__n_closed;
|
13154
|
+
}
|
13155
|
+
/* UNREACHABLE */;
|
13156
|
+
abort();
|
13157
|
+
}
|
13158
|
+
s_n_llhttp__internal__n_invoke_update_finish_1: {
|
13159
|
+
switch (llhttp__internal__c_update_finish_1(state, p, endp)) {
|
13160
|
+
default:
|
13161
|
+
goto s_n_llhttp__internal__n_invoke_test_lenient_flags;
|
13162
|
+
}
|
13163
|
+
/* UNREACHABLE */;
|
13164
|
+
abort();
|
13165
|
+
}
|
13111
13166
|
s_n_llhttp__internal__n_pause_5: {
|
13112
13167
|
state->error = 0x15;
|
13113
13168
|
state->reason = "on_message_complete pause";
|
@@ -13334,8 +13389,8 @@ static llparse_state_t llhttp__internal__run(
|
|
13334
13389
|
/* UNREACHABLE */;
|
13335
13390
|
abort();
|
13336
13391
|
}
|
13337
|
-
|
13338
|
-
switch (
|
13392
|
+
s_n_llhttp__internal__n_invoke_update_finish_3: {
|
13393
|
+
switch (llhttp__internal__c_update_finish_3(state, p, endp)) {
|
13339
13394
|
default:
|
13340
13395
|
goto s_n_llhttp__internal__n_span_start_llhttp__on_body_2;
|
13341
13396
|
}
|
@@ -13447,8 +13502,8 @@ static llparse_state_t llhttp__internal__run(
|
|
13447
13502
|
/* UNREACHABLE */;
|
13448
13503
|
abort();
|
13449
13504
|
}
|
13450
|
-
|
13451
|
-
switch (
|
13505
|
+
s_n_llhttp__internal__n_invoke_test_lenient_flags_1: {
|
13506
|
+
switch (llhttp__internal__c_test_lenient_flags_1(state, p, endp)) {
|
13452
13507
|
case 0:
|
13453
13508
|
goto s_n_llhttp__internal__n_error_11;
|
13454
13509
|
default:
|
@@ -13460,7 +13515,7 @@ static llparse_state_t llhttp__internal__run(
|
|
13460
13515
|
s_n_llhttp__internal__n_invoke_test_flags_1: {
|
13461
13516
|
switch (llhttp__internal__c_test_flags_1(state, p, endp)) {
|
13462
13517
|
case 1:
|
13463
|
-
goto
|
13518
|
+
goto s_n_llhttp__internal__n_invoke_test_lenient_flags_1;
|
13464
13519
|
default:
|
13465
13520
|
goto s_n_llhttp__internal__n_invoke_llhttp__before_headers_complete;
|
13466
13521
|
}
|
@@ -13696,8 +13751,8 @@ static llparse_state_t llhttp__internal__run(
|
|
13696
13751
|
/* UNREACHABLE */;
|
13697
13752
|
abort();
|
13698
13753
|
}
|
13699
|
-
|
13700
|
-
switch (
|
13754
|
+
s_n_llhttp__internal__n_invoke_test_lenient_flags_2: {
|
13755
|
+
switch (llhttp__internal__c_test_lenient_flags_2(state, p, endp)) {
|
13701
13756
|
case 1:
|
13702
13757
|
goto s_n_llhttp__internal__n_header_value_lenient;
|
13703
13758
|
default:
|
@@ -14058,7 +14113,7 @@ static llparse_state_t llhttp__internal__run(
|
|
14058
14113
|
abort();
|
14059
14114
|
}
|
14060
14115
|
s_n_llhttp__internal__n_error_23: {
|
14061
|
-
state->error =
|
14116
|
+
state->error = 0x17;
|
14062
14117
|
state->reason = "Pause on PRI/Upgrade";
|
14063
14118
|
state->error_pos = (const char*) p;
|
14064
14119
|
state->_current = (void*) (intptr_t) s_error;
|
data/ext/llhttp/llhttp.h
CHANGED
@@ -24,8 +24,8 @@
|
|
24
24
|
#ifndef INCLUDE_LLHTTP_H_
|
25
25
|
#define INCLUDE_LLHTTP_H_
|
26
26
|
|
27
|
-
#define LLHTTP_VERSION_MAJOR
|
28
|
-
#define LLHTTP_VERSION_MINOR
|
27
|
+
#define LLHTTP_VERSION_MAJOR 5
|
28
|
+
#define LLHTTP_VERSION_MINOR 1
|
29
29
|
#define LLHTTP_VERSION_PATCH 0
|
30
30
|
|
31
31
|
#ifndef LLHTTP_STRICT_MODE
|
@@ -102,7 +102,8 @@ enum llhttp_errno {
|
|
102
102
|
HPE_CB_CHUNK_COMPLETE = 20,
|
103
103
|
HPE_PAUSED = 21,
|
104
104
|
HPE_PAUSED_UPGRADE = 22,
|
105
|
-
|
105
|
+
HPE_PAUSED_H2_UPGRADE = 23,
|
106
|
+
HPE_USER = 24
|
106
107
|
};
|
107
108
|
typedef enum llhttp_errno llhttp_errno_t;
|
108
109
|
|
@@ -121,7 +122,8 @@ typedef enum llhttp_flags llhttp_flags_t;
|
|
121
122
|
|
122
123
|
enum llhttp_lenient_flags {
|
123
124
|
LENIENT_HEADERS = 0x1,
|
124
|
-
LENIENT_CHUNKED_LENGTH = 0x2
|
125
|
+
LENIENT_CHUNKED_LENGTH = 0x2,
|
126
|
+
LENIENT_KEEP_ALIVE = 0x4
|
125
127
|
};
|
126
128
|
typedef enum llhttp_lenient_flags llhttp_lenient_flags_t;
|
127
129
|
|
@@ -213,7 +215,8 @@ typedef enum llhttp_method llhttp_method_t;
|
|
213
215
|
XX(20, CB_CHUNK_COMPLETE, CB_CHUNK_COMPLETE) \
|
214
216
|
XX(21, PAUSED, PAUSED) \
|
215
217
|
XX(22, PAUSED_UPGRADE, PAUSED_UPGRADE) \
|
216
|
-
XX(23,
|
218
|
+
XX(23, PAUSED_H2_UPGRADE, PAUSED_H2_UPGRADE) \
|
219
|
+
XX(24, USER, USER) \
|
217
220
|
|
218
221
|
|
219
222
|
#define HTTP_METHOD_MAP(XX) \
|
@@ -278,6 +281,12 @@ extern "C" {
|
|
278
281
|
#endif
|
279
282
|
#include <stddef.h>
|
280
283
|
|
284
|
+
#if defined(__wasm__)
|
285
|
+
#define LLHTTP_EXPORT __attribute__((visibility("default")))
|
286
|
+
#else
|
287
|
+
#define LLHTTP_EXPORT
|
288
|
+
#endif
|
289
|
+
|
281
290
|
typedef llhttp__internal_t llhttp_t;
|
282
291
|
typedef struct llhttp_settings_s llhttp_settings_t;
|
283
292
|
|
@@ -328,15 +337,46 @@ struct llhttp_settings_s {
|
|
328
337
|
* the `parser` here. In practice, `settings` has to be either a static
|
329
338
|
* variable or be allocated with `malloc`, `new`, etc.
|
330
339
|
*/
|
340
|
+
LLHTTP_EXPORT
|
331
341
|
void llhttp_init(llhttp_t* parser, llhttp_type_t type,
|
332
342
|
const llhttp_settings_t* settings);
|
333
343
|
|
344
|
+
#if defined(__wasm__)
|
345
|
+
|
346
|
+
LLHTTP_EXPORT
|
347
|
+
llhttp_t* llhttp_alloc(llhttp_type_t type);
|
348
|
+
|
349
|
+
LLHTTP_EXPORT
|
350
|
+
void llhttp_free(llhttp_t* parser);
|
351
|
+
|
352
|
+
LLHTTP_EXPORT
|
353
|
+
uint8_t llhttp_get_type(llhttp_t* parser);
|
354
|
+
|
355
|
+
LLHTTP_EXPORT
|
356
|
+
uint8_t llhttp_get_http_major(llhttp_t* parser);
|
357
|
+
|
358
|
+
LLHTTP_EXPORT
|
359
|
+
uint8_t llhttp_get_http_minor(llhttp_t* parser);
|
360
|
+
|
361
|
+
LLHTTP_EXPORT
|
362
|
+
uint8_t llhttp_get_method(llhttp_t* parser);
|
363
|
+
|
364
|
+
LLHTTP_EXPORT
|
365
|
+
int llhttp_get_status_code(llhttp_t* parser);
|
366
|
+
|
367
|
+
LLHTTP_EXPORT
|
368
|
+
uint8_t llhttp_get_upgrade(llhttp_t* parser);
|
369
|
+
|
370
|
+
#endif // defined(__wasm__)
|
371
|
+
|
334
372
|
/* Reset an already initialized parser back to the start state, preserving the
|
335
373
|
* existing parser type, callback settings, user data, and lenient flags.
|
336
374
|
*/
|
375
|
+
LLHTTP_EXPORT
|
337
376
|
void llhttp_reset(llhttp_t* parser);
|
338
377
|
|
339
378
|
/* Initialize the settings object */
|
379
|
+
LLHTTP_EXPORT
|
340
380
|
void llhttp_settings_init(llhttp_settings_t* settings);
|
341
381
|
|
342
382
|
/* Parse full or partial request/response, invoking user callbacks along the
|
@@ -355,6 +395,7 @@ void llhttp_settings_init(llhttp_settings_t* settings);
|
|
355
395
|
* to return the same error upon each successive call up until `llhttp_init()`
|
356
396
|
* is called.
|
357
397
|
*/
|
398
|
+
LLHTTP_EXPORT
|
358
399
|
llhttp_errno_t llhttp_execute(llhttp_t* parser, const char* data, size_t len);
|
359
400
|
|
360
401
|
/* This method should be called when the other side has no further bytes to
|
@@ -365,16 +406,19 @@ llhttp_errno_t llhttp_execute(llhttp_t* parser, const char* data, size_t len);
|
|
365
406
|
* connection. This method will invoke `on_message_complete()` callback if the
|
366
407
|
* request was terminated safely. Otherwise a error code would be returned.
|
367
408
|
*/
|
409
|
+
LLHTTP_EXPORT
|
368
410
|
llhttp_errno_t llhttp_finish(llhttp_t* parser);
|
369
411
|
|
370
412
|
/* Returns `1` if the incoming message is parsed until the last byte, and has
|
371
413
|
* to be completed by calling `llhttp_finish()` on EOF
|
372
414
|
*/
|
415
|
+
LLHTTP_EXPORT
|
373
416
|
int llhttp_message_needs_eof(const llhttp_t* parser);
|
374
417
|
|
375
418
|
/* Returns `1` if there might be any other messages following the last that was
|
376
419
|
* successfully parsed.
|
377
420
|
*/
|
421
|
+
LLHTTP_EXPORT
|
378
422
|
int llhttp_should_keep_alive(const llhttp_t* parser);
|
379
423
|
|
380
424
|
/* Make further calls of `llhttp_execute()` return `HPE_PAUSED` and set
|
@@ -383,6 +427,7 @@ int llhttp_should_keep_alive(const llhttp_t* parser);
|
|
383
427
|
* Important: do not call this from user callbacks! User callbacks must return
|
384
428
|
* `HPE_PAUSED` if pausing is required.
|
385
429
|
*/
|
430
|
+
LLHTTP_EXPORT
|
386
431
|
void llhttp_pause(llhttp_t* parser);
|
387
432
|
|
388
433
|
/* Might be called to resume the execution after the pause in user's callback.
|
@@ -390,6 +435,7 @@ void llhttp_pause(llhttp_t* parser);
|
|
390
435
|
*
|
391
436
|
* Call this only if `llhttp_execute()` returns `HPE_PAUSED`.
|
392
437
|
*/
|
438
|
+
LLHTTP_EXPORT
|
393
439
|
void llhttp_resume(llhttp_t* parser);
|
394
440
|
|
395
441
|
/* Might be called to resume the execution after the pause in user's callback.
|
@@ -397,9 +443,11 @@ void llhttp_resume(llhttp_t* parser);
|
|
397
443
|
*
|
398
444
|
* Call this only if `llhttp_execute()` returns `HPE_PAUSED_UPGRADE`
|
399
445
|
*/
|
446
|
+
LLHTTP_EXPORT
|
400
447
|
void llhttp_resume_after_upgrade(llhttp_t* parser);
|
401
448
|
|
402
449
|
/* Returns the latest return error */
|
450
|
+
LLHTTP_EXPORT
|
403
451
|
llhttp_errno_t llhttp_get_errno(const llhttp_t* parser);
|
404
452
|
|
405
453
|
/* Returns the verbal explanation of the latest returned error.
|
@@ -407,6 +455,7 @@ llhttp_errno_t llhttp_get_errno(const llhttp_t* parser);
|
|
407
455
|
* Note: User callback should set error reason when returning the error. See
|
408
456
|
* `llhttp_set_error_reason()` for details.
|
409
457
|
*/
|
458
|
+
LLHTTP_EXPORT
|
410
459
|
const char* llhttp_get_error_reason(const llhttp_t* parser);
|
411
460
|
|
412
461
|
/* Assign verbal description to the returned error. Must be called in user
|
@@ -414,6 +463,7 @@ const char* llhttp_get_error_reason(const llhttp_t* parser);
|
|
414
463
|
*
|
415
464
|
* Note: `HPE_USER` error code might be useful in user callbacks.
|
416
465
|
*/
|
466
|
+
LLHTTP_EXPORT
|
417
467
|
void llhttp_set_error_reason(llhttp_t* parser, const char* reason);
|
418
468
|
|
419
469
|
/* Returns the pointer to the last parsed byte before the returned error. The
|
@@ -421,12 +471,15 @@ void llhttp_set_error_reason(llhttp_t* parser, const char* reason);
|
|
421
471
|
*
|
422
472
|
* Note: this method might be useful for counting the number of parsed bytes.
|
423
473
|
*/
|
474
|
+
LLHTTP_EXPORT
|
424
475
|
const char* llhttp_get_error_pos(const llhttp_t* parser);
|
425
476
|
|
426
477
|
/* Returns textual name of error code */
|
478
|
+
LLHTTP_EXPORT
|
427
479
|
const char* llhttp_errno_name(llhttp_errno_t err);
|
428
480
|
|
429
481
|
/* Returns textual name of HTTP method */
|
482
|
+
LLHTTP_EXPORT
|
430
483
|
const char* llhttp_method_name(llhttp_method_t method);
|
431
484
|
|
432
485
|
|
@@ -439,6 +492,7 @@ const char* llhttp_method_name(llhttp_method_t method);
|
|
439
492
|
*
|
440
493
|
* **(USE AT YOUR OWN RISK)**
|
441
494
|
*/
|
495
|
+
LLHTTP_EXPORT
|
442
496
|
void llhttp_set_lenient_headers(llhttp_t* parser, int enabled);
|
443
497
|
|
444
498
|
|
@@ -452,8 +506,23 @@ void llhttp_set_lenient_headers(llhttp_t* parser, int enabled);
|
|
452
506
|
*
|
453
507
|
* **(USE AT YOUR OWN RISK)**
|
454
508
|
*/
|
509
|
+
LLHTTP_EXPORT
|
455
510
|
void llhttp_set_lenient_chunked_length(llhttp_t* parser, int enabled);
|
456
511
|
|
512
|
+
|
513
|
+
/* Enables/disables lenient handling of `Connection: close` and HTTP/1.0
|
514
|
+
* requests responses.
|
515
|
+
*
|
516
|
+
* Normally `llhttp` would error on (in strict mode) or discard (in loose mode)
|
517
|
+
* the HTTP request/response after the request/response with `Connection: close`
|
518
|
+
* and `Content-Length`. This is important to prevent cache poisoning attacks,
|
519
|
+
* but might interact badly with outdated and insecure clients. With this flag
|
520
|
+
* the extra request/response will be parsed normally.
|
521
|
+
*
|
522
|
+
* **(USE AT YOUR OWN RISK)**
|
523
|
+
*/
|
524
|
+
void llhttp_set_lenient_keep_alive(llhttp_t* parser, int enabled);
|
525
|
+
|
457
526
|
#ifdef __cplusplus
|
458
527
|
} /* extern "C" */
|
459
528
|
#endif
|
data/lib/llhttp/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: llhttp-ffi
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Bryan Powell
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-04-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: ffi-compiler
|
@@ -55,11 +55,6 @@ files:
|
|
55
55
|
- ext/llhttp/llhttp.c
|
56
56
|
- ext/llhttp/llhttp.h
|
57
57
|
- ext/llhttp/llhttp_ext.c
|
58
|
-
- ext/x86_64-darwin/libllhttp-ext.bundle
|
59
|
-
- ext/x86_64-darwin/llhttp/api.o
|
60
|
-
- ext/x86_64-darwin/llhttp/http.o
|
61
|
-
- ext/x86_64-darwin/llhttp/llhttp.o
|
62
|
-
- ext/x86_64-darwin/llhttp/llhttp_ext.o
|
63
58
|
- lib/llhttp.rb
|
64
59
|
- lib/llhttp/delegate.rb
|
65
60
|
- lib/llhttp/error.rb
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|