ed-precompiled_puma 7.0.4

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.
Files changed (88) hide show
  1. checksums.yaml +7 -0
  2. data/History.md +3172 -0
  3. data/LICENSE +29 -0
  4. data/README.md +477 -0
  5. data/bin/puma +10 -0
  6. data/bin/puma-wild +25 -0
  7. data/bin/pumactl +12 -0
  8. data/docs/architecture.md +74 -0
  9. data/docs/compile_options.md +55 -0
  10. data/docs/deployment.md +102 -0
  11. data/docs/fork_worker.md +41 -0
  12. data/docs/images/puma-connection-flow-no-reactor.png +0 -0
  13. data/docs/images/puma-connection-flow.png +0 -0
  14. data/docs/images/puma-general-arch.png +0 -0
  15. data/docs/java_options.md +54 -0
  16. data/docs/jungle/README.md +9 -0
  17. data/docs/jungle/rc.d/README.md +74 -0
  18. data/docs/jungle/rc.d/puma +61 -0
  19. data/docs/jungle/rc.d/puma.conf +10 -0
  20. data/docs/kubernetes.md +80 -0
  21. data/docs/nginx.md +80 -0
  22. data/docs/plugins.md +42 -0
  23. data/docs/rails_dev_mode.md +28 -0
  24. data/docs/restart.md +65 -0
  25. data/docs/signals.md +98 -0
  26. data/docs/stats.md +148 -0
  27. data/docs/systemd.md +253 -0
  28. data/docs/testing_benchmarks_local_files.md +150 -0
  29. data/docs/testing_test_rackup_ci_files.md +36 -0
  30. data/ext/puma_http11/PumaHttp11Service.java +17 -0
  31. data/ext/puma_http11/ext_help.h +15 -0
  32. data/ext/puma_http11/extconf.rb +65 -0
  33. data/ext/puma_http11/http11_parser.c +1057 -0
  34. data/ext/puma_http11/http11_parser.h +65 -0
  35. data/ext/puma_http11/http11_parser.java.rl +145 -0
  36. data/ext/puma_http11/http11_parser.rl +149 -0
  37. data/ext/puma_http11/http11_parser_common.rl +54 -0
  38. data/ext/puma_http11/mini_ssl.c +852 -0
  39. data/ext/puma_http11/no_ssl/PumaHttp11Service.java +15 -0
  40. data/ext/puma_http11/org/jruby/puma/Http11.java +257 -0
  41. data/ext/puma_http11/org/jruby/puma/Http11Parser.java +455 -0
  42. data/ext/puma_http11/org/jruby/puma/MiniSSL.java +509 -0
  43. data/ext/puma_http11/puma_http11.c +507 -0
  44. data/lib/puma/app/status.rb +96 -0
  45. data/lib/puma/binder.rb +511 -0
  46. data/lib/puma/cli.rb +245 -0
  47. data/lib/puma/client.rb +720 -0
  48. data/lib/puma/cluster/worker.rb +182 -0
  49. data/lib/puma/cluster/worker_handle.rb +127 -0
  50. data/lib/puma/cluster.rb +635 -0
  51. data/lib/puma/cluster_accept_loop_delay.rb +91 -0
  52. data/lib/puma/commonlogger.rb +115 -0
  53. data/lib/puma/configuration.rb +452 -0
  54. data/lib/puma/const.rb +307 -0
  55. data/lib/puma/control_cli.rb +320 -0
  56. data/lib/puma/detect.rb +47 -0
  57. data/lib/puma/dsl.rb +1480 -0
  58. data/lib/puma/error_logger.rb +115 -0
  59. data/lib/puma/events.rb +72 -0
  60. data/lib/puma/io_buffer.rb +50 -0
  61. data/lib/puma/jruby_restart.rb +11 -0
  62. data/lib/puma/json_serialization.rb +96 -0
  63. data/lib/puma/launcher/bundle_pruner.rb +104 -0
  64. data/lib/puma/launcher.rb +496 -0
  65. data/lib/puma/log_writer.rb +147 -0
  66. data/lib/puma/minissl/context_builder.rb +96 -0
  67. data/lib/puma/minissl.rb +463 -0
  68. data/lib/puma/null_io.rb +101 -0
  69. data/lib/puma/plugin/systemd.rb +90 -0
  70. data/lib/puma/plugin/tmp_restart.rb +36 -0
  71. data/lib/puma/plugin.rb +111 -0
  72. data/lib/puma/rack/builder.rb +297 -0
  73. data/lib/puma/rack/urlmap.rb +93 -0
  74. data/lib/puma/rack_default.rb +24 -0
  75. data/lib/puma/reactor.rb +140 -0
  76. data/lib/puma/request.rb +701 -0
  77. data/lib/puma/runner.rb +211 -0
  78. data/lib/puma/sd_notify.rb +146 -0
  79. data/lib/puma/server.rb +734 -0
  80. data/lib/puma/single.rb +72 -0
  81. data/lib/puma/state_file.rb +69 -0
  82. data/lib/puma/thread_pool.rb +402 -0
  83. data/lib/puma/util.rb +134 -0
  84. data/lib/puma.rb +93 -0
  85. data/lib/rack/handler/puma.rb +144 -0
  86. data/tools/Dockerfile +18 -0
  87. data/tools/trickletest.rb +44 -0
  88. metadata +152 -0
@@ -0,0 +1,455 @@
1
+
2
+ // line 1 "ext/puma_http11/http11_parser.java.rl"
3
+ package org.jruby.puma;
4
+
5
+ import org.jruby.Ruby;
6
+ import org.jruby.RubyHash;
7
+ import org.jruby.util.ByteList;
8
+
9
+ public class Http11Parser {
10
+
11
+ /** Machine **/
12
+
13
+
14
+ // line 58 "ext/puma_http11/http11_parser.java.rl"
15
+
16
+
17
+ /** Data **/
18
+
19
+ // line 20 "ext/puma_http11/org/jruby/puma/Http11Parser.java"
20
+ private static byte[] init__puma_parser_actions_0()
21
+ {
22
+ return new byte [] {
23
+ 0, 1, 0, 1, 2, 1, 3, 1, 4, 1, 5, 1,
24
+ 6, 1, 7, 1, 8, 1, 9, 1, 11, 1, 12, 1,
25
+ 13, 2, 0, 8, 2, 1, 2, 2, 4, 5, 2, 10,
26
+ 7, 2, 12, 7, 3, 9, 10, 7
27
+ };
28
+ }
29
+
30
+ private static final byte _puma_parser_actions[] = init__puma_parser_actions_0();
31
+
32
+
33
+ private static short[] init__puma_parser_key_offsets_0()
34
+ {
35
+ return new short [] {
36
+ 0, 0, 8, 17, 27, 29, 30, 31, 32, 33, 34, 36,
37
+ 39, 41, 44, 45, 61, 62, 78, 85, 91, 99, 107, 117,
38
+ 125, 134, 142, 150, 159, 168, 177, 186, 195, 204, 213, 222,
39
+ 231, 240, 249, 258, 267, 276, 285, 294, 303, 312, 313
40
+ };
41
+ }
42
+
43
+ private static final short _puma_parser_key_offsets[] = init__puma_parser_key_offsets_0();
44
+
45
+
46
+ private static char[] init__puma_parser_trans_keys_0()
47
+ {
48
+ return new char [] {
49
+ 36, 95, 45, 46, 48, 57, 65, 90, 32, 36, 95, 45,
50
+ 46, 48, 57, 65, 90, 42, 43, 47, 58, 45, 57, 65,
51
+ 90, 97, 122, 32, 35, 72, 84, 84, 80, 47, 48, 57,
52
+ 46, 48, 57, 48, 57, 13, 48, 57, 10, 13, 33, 124,
53
+ 126, 35, 39, 42, 43, 45, 46, 48, 57, 65, 90, 94,
54
+ 122, 10, 33, 58, 124, 126, 35, 39, 42, 43, 45, 46,
55
+ 48, 57, 65, 90, 94, 122, 13, 32, 127, 0, 8, 10,
56
+ 31, 13, 127, 0, 8, 10, 31, 32, 60, 62, 127, 0,
57
+ 31, 34, 35, 32, 60, 62, 127, 0, 31, 34, 35, 43,
58
+ 58, 45, 46, 48, 57, 65, 90, 97, 122, 32, 34, 35,
59
+ 60, 62, 127, 0, 31, 32, 34, 35, 60, 62, 63, 127,
60
+ 0, 31, 32, 34, 35, 60, 62, 127, 0, 31, 32, 34,
61
+ 35, 60, 62, 127, 0, 31, 32, 36, 95, 45, 46, 48,
62
+ 57, 65, 90, 32, 36, 95, 45, 46, 48, 57, 65, 90,
63
+ 32, 36, 95, 45, 46, 48, 57, 65, 90, 32, 36, 95,
64
+ 45, 46, 48, 57, 65, 90, 32, 36, 95, 45, 46, 48,
65
+ 57, 65, 90, 32, 36, 95, 45, 46, 48, 57, 65, 90,
66
+ 32, 36, 95, 45, 46, 48, 57, 65, 90, 32, 36, 95,
67
+ 45, 46, 48, 57, 65, 90, 32, 36, 95, 45, 46, 48,
68
+ 57, 65, 90, 32, 36, 95, 45, 46, 48, 57, 65, 90,
69
+ 32, 36, 95, 45, 46, 48, 57, 65, 90, 32, 36, 95,
70
+ 45, 46, 48, 57, 65, 90, 32, 36, 95, 45, 46, 48,
71
+ 57, 65, 90, 32, 36, 95, 45, 46, 48, 57, 65, 90,
72
+ 32, 36, 95, 45, 46, 48, 57, 65, 90, 32, 36, 95,
73
+ 45, 46, 48, 57, 65, 90, 32, 36, 95, 45, 46, 48,
74
+ 57, 65, 90, 32, 36, 95, 45, 46, 48, 57, 65, 90,
75
+ 32, 0
76
+ };
77
+ }
78
+
79
+ private static final char _puma_parser_trans_keys[] = init__puma_parser_trans_keys_0();
80
+
81
+
82
+ private static byte[] init__puma_parser_single_lengths_0()
83
+ {
84
+ return new byte [] {
85
+ 0, 2, 3, 4, 2, 1, 1, 1, 1, 1, 0, 1,
86
+ 0, 1, 1, 4, 1, 4, 3, 2, 4, 4, 2, 6,
87
+ 7, 6, 6, 3, 3, 3, 3, 3, 3, 3, 3, 3,
88
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 0
89
+ };
90
+ }
91
+
92
+ private static final byte _puma_parser_single_lengths[] = init__puma_parser_single_lengths_0();
93
+
94
+
95
+ private static byte[] init__puma_parser_range_lengths_0()
96
+ {
97
+ return new byte [] {
98
+ 0, 3, 3, 3, 0, 0, 0, 0, 0, 0, 1, 1,
99
+ 1, 1, 0, 6, 0, 6, 2, 2, 2, 2, 4, 1,
100
+ 1, 1, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3,
101
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0
102
+ };
103
+ }
104
+
105
+ private static final byte _puma_parser_range_lengths[] = init__puma_parser_range_lengths_0();
106
+
107
+
108
+ private static short[] init__puma_parser_index_offsets_0()
109
+ {
110
+ return new short [] {
111
+ 0, 0, 6, 13, 21, 24, 26, 28, 30, 32, 34, 36,
112
+ 39, 41, 44, 46, 57, 59, 70, 76, 81, 88, 95, 102,
113
+ 110, 119, 127, 135, 142, 149, 156, 163, 170, 177, 184, 191,
114
+ 198, 205, 212, 219, 226, 233, 240, 247, 254, 261, 263
115
+ };
116
+ }
117
+
118
+ private static final short _puma_parser_index_offsets[] = init__puma_parser_index_offsets_0();
119
+
120
+
121
+ private static byte[] init__puma_parser_indicies_0()
122
+ {
123
+ return new byte [] {
124
+ 0, 0, 0, 0, 0, 1, 2, 3, 3, 3, 3, 3,
125
+ 1, 4, 5, 6, 7, 5, 5, 5, 1, 8, 9, 1,
126
+ 10, 1, 11, 1, 12, 1, 13, 1, 14, 1, 15, 1,
127
+ 16, 15, 1, 17, 1, 18, 17, 1, 19, 1, 20, 21,
128
+ 21, 21, 21, 21, 21, 21, 21, 21, 1, 22, 1, 23,
129
+ 24, 23, 23, 23, 23, 23, 23, 23, 23, 1, 26, 27,
130
+ 1, 1, 1, 25, 29, 1, 1, 1, 28, 30, 1, 1,
131
+ 1, 1, 1, 31, 32, 1, 1, 1, 1, 1, 33, 34,
132
+ 35, 34, 34, 34, 34, 1, 8, 1, 9, 1, 1, 1,
133
+ 1, 35, 36, 1, 38, 1, 1, 39, 1, 1, 37, 40,
134
+ 1, 42, 1, 1, 1, 1, 41, 43, 1, 45, 1, 1,
135
+ 1, 1, 44, 2, 46, 46, 46, 46, 46, 1, 2, 47,
136
+ 47, 47, 47, 47, 1, 2, 48, 48, 48, 48, 48, 1,
137
+ 2, 49, 49, 49, 49, 49, 1, 2, 50, 50, 50, 50,
138
+ 50, 1, 2, 51, 51, 51, 51, 51, 1, 2, 52, 52,
139
+ 52, 52, 52, 1, 2, 53, 53, 53, 53, 53, 1, 2,
140
+ 54, 54, 54, 54, 54, 1, 2, 55, 55, 55, 55, 55,
141
+ 1, 2, 56, 56, 56, 56, 56, 1, 2, 57, 57, 57,
142
+ 57, 57, 1, 2, 58, 58, 58, 58, 58, 1, 2, 59,
143
+ 59, 59, 59, 59, 1, 2, 60, 60, 60, 60, 60, 1,
144
+ 2, 61, 61, 61, 61, 61, 1, 2, 62, 62, 62, 62,
145
+ 62, 1, 2, 63, 63, 63, 63, 63, 1, 2, 1, 1,
146
+ 0
147
+ };
148
+ }
149
+
150
+ private static final byte _puma_parser_indicies[] = init__puma_parser_indicies_0();
151
+
152
+
153
+ private static byte[] init__puma_parser_trans_targs_0()
154
+ {
155
+ return new byte [] {
156
+ 2, 0, 3, 27, 4, 22, 24, 23, 5, 20, 6, 7,
157
+ 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 46, 17,
158
+ 18, 19, 14, 18, 19, 14, 5, 21, 5, 21, 22, 23,
159
+ 5, 24, 20, 25, 5, 26, 20, 5, 26, 20, 28, 29,
160
+ 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41,
161
+ 42, 43, 44, 45
162
+ };
163
+ }
164
+
165
+ private static final byte _puma_parser_trans_targs[] = init__puma_parser_trans_targs_0();
166
+
167
+
168
+ private static byte[] init__puma_parser_trans_actions_0()
169
+ {
170
+ return new byte [] {
171
+ 1, 0, 11, 0, 1, 1, 1, 1, 13, 13, 1, 0,
172
+ 0, 0, 0, 0, 0, 0, 19, 0, 0, 28, 23, 3,
173
+ 5, 7, 31, 7, 0, 9, 25, 1, 15, 0, 0, 0,
174
+ 37, 0, 37, 21, 40, 17, 40, 34, 0, 34, 0, 0,
175
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
176
+ 0, 0, 0, 0
177
+ };
178
+ }
179
+
180
+ private static final byte _puma_parser_trans_actions[] = init__puma_parser_trans_actions_0();
181
+
182
+
183
+ static final int puma_parser_start = 1;
184
+ static final int puma_parser_first_final = 46;
185
+ static final int puma_parser_error = 0;
186
+
187
+
188
+ // line 62 "ext/puma_http11/http11_parser.java.rl"
189
+
190
+ public static interface ElementCB {
191
+ public void call(Ruby runtime, RubyHash data, ByteList buffer, int at, int length);
192
+ }
193
+
194
+ public static interface FieldCB {
195
+ public void call(Ruby runtime, RubyHash data, ByteList buffer, int field, int flen, int value, int vlen);
196
+ }
197
+
198
+ public static class HttpParser {
199
+ int cs;
200
+ int body_start;
201
+ int content_len;
202
+ int nread;
203
+ int mark;
204
+ int field_start;
205
+ int field_len;
206
+ int query_start;
207
+
208
+ RubyHash data;
209
+ ByteList buffer;
210
+
211
+ public void init() {
212
+ cs = 0;
213
+
214
+
215
+ // line 216 "ext/puma_http11/org/jruby/puma/Http11Parser.java"
216
+ {
217
+ cs = puma_parser_start;
218
+ }
219
+
220
+ // line 88 "ext/puma_http11/http11_parser.java.rl"
221
+
222
+ body_start = 0;
223
+ content_len = 0;
224
+ mark = 0;
225
+ nread = 0;
226
+ field_len = 0;
227
+ field_start = 0;
228
+ }
229
+ }
230
+
231
+ public final HttpParser parser = new HttpParser();
232
+
233
+ public int execute(Ruby runtime, Http11 http, ByteList buffer, int off) {
234
+ int p, pe;
235
+ int cs = parser.cs;
236
+ int len = buffer.length();
237
+ assert off<=len : "offset past end of buffer";
238
+
239
+ p = off;
240
+ pe = len;
241
+ // get a copy of the bytes, since it may not start at 0
242
+ // FIXME: figure out how to just use the bytes in-place
243
+ byte[] data = buffer.bytes();
244
+ parser.buffer = buffer;
245
+
246
+
247
+ // line 248 "ext/puma_http11/org/jruby/puma/Http11Parser.java"
248
+ {
249
+ int _klen;
250
+ int _trans = 0;
251
+ int _acts;
252
+ int _nacts;
253
+ int _keys;
254
+ int _goto_targ = 0;
255
+
256
+ _goto: while (true) {
257
+ switch ( _goto_targ ) {
258
+ case 0:
259
+ if ( p == pe ) {
260
+ _goto_targ = 4;
261
+ continue _goto;
262
+ }
263
+ if ( cs == 0 ) {
264
+ _goto_targ = 5;
265
+ continue _goto;
266
+ }
267
+ case 1:
268
+ _match: do {
269
+ _keys = _puma_parser_key_offsets[cs];
270
+ _trans = _puma_parser_index_offsets[cs];
271
+ _klen = _puma_parser_single_lengths[cs];
272
+ if ( _klen > 0 ) {
273
+ int _lower = _keys;
274
+ int _mid;
275
+ int _upper = _keys + _klen - 1;
276
+ while (true) {
277
+ if ( _upper < _lower )
278
+ break;
279
+
280
+ _mid = _lower + ((_upper-_lower) >> 1);
281
+ if ( data[p] < _puma_parser_trans_keys[_mid] )
282
+ _upper = _mid - 1;
283
+ else if ( data[p] > _puma_parser_trans_keys[_mid] )
284
+ _lower = _mid + 1;
285
+ else {
286
+ _trans += (_mid - _keys);
287
+ break _match;
288
+ }
289
+ }
290
+ _keys += _klen;
291
+ _trans += _klen;
292
+ }
293
+
294
+ _klen = _puma_parser_range_lengths[cs];
295
+ if ( _klen > 0 ) {
296
+ int _lower = _keys;
297
+ int _mid;
298
+ int _upper = _keys + (_klen<<1) - 2;
299
+ while (true) {
300
+ if ( _upper < _lower )
301
+ break;
302
+
303
+ _mid = _lower + (((_upper-_lower) >> 1) & ~1);
304
+ if ( data[p] < _puma_parser_trans_keys[_mid] )
305
+ _upper = _mid - 2;
306
+ else if ( data[p] > _puma_parser_trans_keys[_mid+1] )
307
+ _lower = _mid + 2;
308
+ else {
309
+ _trans += ((_mid - _keys)>>1);
310
+ break _match;
311
+ }
312
+ }
313
+ _trans += _klen;
314
+ }
315
+ } while (false);
316
+
317
+ _trans = _puma_parser_indicies[_trans];
318
+ cs = _puma_parser_trans_targs[_trans];
319
+
320
+ if ( _puma_parser_trans_actions[_trans] != 0 ) {
321
+ _acts = _puma_parser_trans_actions[_trans];
322
+ _nacts = (int) _puma_parser_actions[_acts++];
323
+ while ( _nacts-- > 0 )
324
+ {
325
+ switch ( _puma_parser_actions[_acts++] )
326
+ {
327
+ case 0:
328
+ // line 15 "ext/puma_http11/http11_parser.java.rl"
329
+ {parser.mark = p; }
330
+ break;
331
+ case 1:
332
+ // line 17 "ext/puma_http11/http11_parser.java.rl"
333
+ { parser.field_start = p; }
334
+ break;
335
+ case 2:
336
+ // line 18 "ext/puma_http11/http11_parser.java.rl"
337
+ { /* FIXME stub */ }
338
+ break;
339
+ case 3:
340
+ // line 19 "ext/puma_http11/http11_parser.java.rl"
341
+ {
342
+ parser.field_len = p-parser.field_start;
343
+ }
344
+ break;
345
+ case 4:
346
+ // line 23 "ext/puma_http11/http11_parser.java.rl"
347
+ { parser.mark = p; }
348
+ break;
349
+ case 5:
350
+ // line 24 "ext/puma_http11/http11_parser.java.rl"
351
+ {
352
+ Http11.http_field(runtime, parser.data, parser.buffer, parser.field_start, parser.field_len, parser.mark, p-parser.mark);
353
+ }
354
+ break;
355
+ case 6:
356
+ // line 27 "ext/puma_http11/http11_parser.java.rl"
357
+ {
358
+ Http11.request_method(runtime, parser.data, parser.buffer, parser.mark, p-parser.mark);
359
+ }
360
+ break;
361
+ case 7:
362
+ // line 30 "ext/puma_http11/http11_parser.java.rl"
363
+ {
364
+ Http11.request_uri(runtime, parser.data, parser.buffer, parser.mark, p-parser.mark);
365
+ }
366
+ break;
367
+ case 8:
368
+ // line 33 "ext/puma_http11/http11_parser.java.rl"
369
+ {
370
+ Http11.fragment(runtime, parser.data, parser.buffer, parser.mark, p-parser.mark);
371
+ }
372
+ break;
373
+ case 9:
374
+ // line 37 "ext/puma_http11/http11_parser.java.rl"
375
+ {parser.query_start = p; }
376
+ break;
377
+ case 10:
378
+ // line 38 "ext/puma_http11/http11_parser.java.rl"
379
+ {
380
+ Http11.query_string(runtime, parser.data, parser.buffer, parser.query_start, p-parser.query_start);
381
+ }
382
+ break;
383
+ case 11:
384
+ // line 42 "ext/puma_http11/http11_parser.java.rl"
385
+ {
386
+ Http11.server_protocol(runtime, parser.data, parser.buffer, parser.mark, p-parser.mark);
387
+ }
388
+ break;
389
+ case 12:
390
+ // line 46 "ext/puma_http11/http11_parser.java.rl"
391
+ {
392
+ Http11.request_path(runtime, parser.data, parser.buffer, parser.mark, p-parser.mark);
393
+ }
394
+ break;
395
+ case 13:
396
+ // line 50 "ext/puma_http11/http11_parser.java.rl"
397
+ {
398
+ parser.body_start = p + 1;
399
+ http.header_done(runtime, parser.data, parser.buffer, p + 1, pe - p - 1);
400
+ { p += 1; _goto_targ = 5; if (true) continue _goto;}
401
+ }
402
+ break;
403
+ // line 404 "ext/puma_http11/org/jruby/puma/Http11Parser.java"
404
+ }
405
+ }
406
+ }
407
+
408
+ case 2:
409
+ if ( cs == 0 ) {
410
+ _goto_targ = 5;
411
+ continue _goto;
412
+ }
413
+ if ( ++p != pe ) {
414
+ _goto_targ = 1;
415
+ continue _goto;
416
+ }
417
+ case 4:
418
+ case 5:
419
+ }
420
+ break; }
421
+ }
422
+
423
+ // line 114 "ext/puma_http11/http11_parser.java.rl"
424
+
425
+ parser.cs = cs;
426
+ parser.nread += (p - off);
427
+
428
+ assert p <= pe : "buffer overflow after parsing execute";
429
+ assert parser.nread <= len : "nread longer than length";
430
+ assert parser.body_start <= len : "body starts after buffer end";
431
+ assert parser.mark < len : "mark is after buffer end";
432
+ assert parser.field_len <= len : "field has length longer than whole buffer";
433
+ assert parser.field_start < len : "field starts after buffer end";
434
+
435
+ return parser.nread;
436
+ }
437
+
438
+ public int finish() {
439
+ if(has_error()) {
440
+ return -1;
441
+ } else if(is_finished()) {
442
+ return 1;
443
+ } else {
444
+ return 0;
445
+ }
446
+ }
447
+
448
+ public boolean has_error() {
449
+ return parser.cs == puma_parser_error;
450
+ }
451
+
452
+ public boolean is_finished() {
453
+ return parser.cs == puma_parser_first_final;
454
+ }
455
+ }