puma-simon 3.7.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (157) hide show
  1. checksums.yaml +7 -0
  2. data/.github/issue_template.md +20 -0
  3. data/.gitignore +18 -0
  4. data/.hoeignore +12 -0
  5. data/.travis.yml +29 -0
  6. data/DEPLOYMENT.md +91 -0
  7. data/Gemfile +12 -0
  8. data/History.md +1254 -0
  9. data/LICENSE +26 -0
  10. data/Manifest.txt +78 -0
  11. data/README.md +353 -0
  12. data/Rakefile +158 -0
  13. data/Release.md +9 -0
  14. data/bin/puma +10 -0
  15. data/bin/puma-wild +31 -0
  16. data/bin/pumactl +12 -0
  17. data/docs/nginx.md +80 -0
  18. data/docs/signals.md +43 -0
  19. data/docs/systemd.md +197 -0
  20. data/examples/CA/cacert.pem +23 -0
  21. data/examples/CA/newcerts/cert_1.pem +19 -0
  22. data/examples/CA/newcerts/cert_2.pem +19 -0
  23. data/examples/CA/private/cakeypair.pem +30 -0
  24. data/examples/CA/serial +1 -0
  25. data/examples/config.rb +200 -0
  26. data/examples/plugins/redis_stop_puma.rb +46 -0
  27. data/examples/puma/cert_puma.pem +19 -0
  28. data/examples/puma/client-certs/ca.crt +19 -0
  29. data/examples/puma/client-certs/ca.key +27 -0
  30. data/examples/puma/client-certs/client.crt +19 -0
  31. data/examples/puma/client-certs/client.key +27 -0
  32. data/examples/puma/client-certs/client_expired.crt +19 -0
  33. data/examples/puma/client-certs/client_expired.key +27 -0
  34. data/examples/puma/client-certs/client_unknown.crt +19 -0
  35. data/examples/puma/client-certs/client_unknown.key +27 -0
  36. data/examples/puma/client-certs/generate.rb +78 -0
  37. data/examples/puma/client-certs/keystore.jks +0 -0
  38. data/examples/puma/client-certs/server.crt +19 -0
  39. data/examples/puma/client-certs/server.key +27 -0
  40. data/examples/puma/client-certs/server.p12 +0 -0
  41. data/examples/puma/client-certs/unknown_ca.crt +19 -0
  42. data/examples/puma/client-certs/unknown_ca.key +27 -0
  43. data/examples/puma/csr_puma.pem +11 -0
  44. data/examples/puma/keystore.jks +0 -0
  45. data/examples/puma/puma_keypair.pem +15 -0
  46. data/examples/qc_config.rb +13 -0
  47. data/ext/puma_http11/PumaHttp11Service.java +17 -0
  48. data/ext/puma_http11/ext_help.h +15 -0
  49. data/ext/puma_http11/extconf.rb +15 -0
  50. data/ext/puma_http11/http11_parser.c +1069 -0
  51. data/ext/puma_http11/http11_parser.h +65 -0
  52. data/ext/puma_http11/http11_parser.java.rl +161 -0
  53. data/ext/puma_http11/http11_parser.rl +147 -0
  54. data/ext/puma_http11/http11_parser_common.rl +54 -0
  55. data/ext/puma_http11/io_buffer.c +155 -0
  56. data/ext/puma_http11/mini_ssl.c +457 -0
  57. data/ext/puma_http11/org/jruby/puma/Http11.java +234 -0
  58. data/ext/puma_http11/org/jruby/puma/Http11Parser.java +473 -0
  59. data/ext/puma_http11/org/jruby/puma/MiniSSL.java +339 -0
  60. data/ext/puma_http11/puma_http11.c +500 -0
  61. data/gemfiles/2.1-Gemfile +12 -0
  62. data/lib/puma.rb +15 -0
  63. data/lib/puma/accept_nonblock.rb +23 -0
  64. data/lib/puma/app/status.rb +66 -0
  65. data/lib/puma/binder.rb +402 -0
  66. data/lib/puma/cli.rb +220 -0
  67. data/lib/puma/client.rb +434 -0
  68. data/lib/puma/cluster.rb +510 -0
  69. data/lib/puma/commonlogger.rb +106 -0
  70. data/lib/puma/compat.rb +14 -0
  71. data/lib/puma/configuration.rb +364 -0
  72. data/lib/puma/const.rb +224 -0
  73. data/lib/puma/control_cli.rb +259 -0
  74. data/lib/puma/convenient.rb +23 -0
  75. data/lib/puma/daemon_ext.rb +31 -0
  76. data/lib/puma/delegation.rb +11 -0
  77. data/lib/puma/detect.rb +13 -0
  78. data/lib/puma/dsl.rb +486 -0
  79. data/lib/puma/events.rb +152 -0
  80. data/lib/puma/io_buffer.rb +7 -0
  81. data/lib/puma/java_io_buffer.rb +45 -0
  82. data/lib/puma/jruby_restart.rb +83 -0
  83. data/lib/puma/launcher.rb +410 -0
  84. data/lib/puma/minissl.rb +221 -0
  85. data/lib/puma/null_io.rb +42 -0
  86. data/lib/puma/plugin.rb +115 -0
  87. data/lib/puma/plugin/tmp_restart.rb +35 -0
  88. data/lib/puma/rack/backports/uri/common_193.rb +33 -0
  89. data/lib/puma/rack/builder.rb +298 -0
  90. data/lib/puma/rack/urlmap.rb +91 -0
  91. data/lib/puma/rack_default.rb +7 -0
  92. data/lib/puma/reactor.rb +210 -0
  93. data/lib/puma/runner.rb +171 -0
  94. data/lib/puma/server.rb +949 -0
  95. data/lib/puma/single.rb +112 -0
  96. data/lib/puma/state_file.rb +29 -0
  97. data/lib/puma/tcp_logger.rb +39 -0
  98. data/lib/puma/thread_pool.rb +297 -0
  99. data/lib/puma/util.rb +128 -0
  100. data/lib/rack/handler/puma.rb +78 -0
  101. data/puma.gemspec +52 -0
  102. data/test/ab_rs.rb +22 -0
  103. data/test/config.rb +2 -0
  104. data/test/config/app.rb +9 -0
  105. data/test/config/plugin.rb +1 -0
  106. data/test/config/settings.rb +2 -0
  107. data/test/config/state_file_testing_config.rb +14 -0
  108. data/test/hello-bind.ru +2 -0
  109. data/test/hello-delay.ru +3 -0
  110. data/test/hello-map.ru +3 -0
  111. data/test/hello-post.ru +4 -0
  112. data/test/hello-stuck.ru +1 -0
  113. data/test/hello-tcp.ru +5 -0
  114. data/test/hello.ru +1 -0
  115. data/test/hijack.ru +6 -0
  116. data/test/hijack2.ru +5 -0
  117. data/test/lobster.ru +4 -0
  118. data/test/shell/run.sh +24 -0
  119. data/test/shell/t1.rb +19 -0
  120. data/test/shell/t1_conf.rb +3 -0
  121. data/test/shell/t2.rb +17 -0
  122. data/test/shell/t2_conf.rb +6 -0
  123. data/test/shell/t3.rb +25 -0
  124. data/test/shell/t3_conf.rb +5 -0
  125. data/test/slow.ru +4 -0
  126. data/test/ssl_config.rb +4 -0
  127. data/test/test_app_status.rb +93 -0
  128. data/test/test_binder.rb +31 -0
  129. data/test/test_cli.rb +209 -0
  130. data/test/test_config.rb +95 -0
  131. data/test/test_events.rb +161 -0
  132. data/test/test_helper.rb +50 -0
  133. data/test/test_http10.rb +27 -0
  134. data/test/test_http11.rb +186 -0
  135. data/test/test_integration.rb +247 -0
  136. data/test/test_iobuffer.rb +39 -0
  137. data/test/test_minissl.rb +29 -0
  138. data/test/test_null_io.rb +49 -0
  139. data/test/test_persistent.rb +245 -0
  140. data/test/test_puma_server.rb +626 -0
  141. data/test/test_puma_server_ssl.rb +222 -0
  142. data/test/test_rack_handler.rb +57 -0
  143. data/test/test_rack_server.rb +138 -0
  144. data/test/test_tcp_logger.rb +39 -0
  145. data/test/test_tcp_rack.rb +36 -0
  146. data/test/test_thread_pool.rb +250 -0
  147. data/test/test_unix_socket.rb +35 -0
  148. data/test/test_web_server.rb +88 -0
  149. data/tools/jungle/README.md +9 -0
  150. data/tools/jungle/init.d/README.md +59 -0
  151. data/tools/jungle/init.d/puma +421 -0
  152. data/tools/jungle/init.d/run-puma +18 -0
  153. data/tools/jungle/upstart/README.md +61 -0
  154. data/tools/jungle/upstart/puma-manager.conf +31 -0
  155. data/tools/jungle/upstart/puma.conf +69 -0
  156. data/tools/trickletest.rb +45 -0
  157. metadata +297 -0
@@ -0,0 +1,234 @@
1
+ package org.jruby.puma;
2
+
3
+ import org.jruby.Ruby;
4
+ import org.jruby.RubyClass;
5
+ import org.jruby.RubyHash;
6
+ import org.jruby.RubyModule;
7
+ import org.jruby.RubyNumeric;
8
+ import org.jruby.RubyObject;
9
+ import org.jruby.RubyString;
10
+
11
+ import org.jruby.anno.JRubyMethod;
12
+
13
+ import org.jruby.runtime.ObjectAllocator;
14
+ import org.jruby.runtime.ThreadContext;
15
+ import org.jruby.runtime.builtin.IRubyObject;
16
+
17
+ import org.jruby.exceptions.RaiseException;
18
+
19
+ import org.jruby.util.ByteList;
20
+
21
+ /**
22
+ * @author <a href="mailto:ola.bini@ki.se">Ola Bini</a>
23
+ */
24
+ public class Http11 extends RubyObject {
25
+ public final static int MAX_FIELD_NAME_LENGTH = 256;
26
+ public final static String MAX_FIELD_NAME_LENGTH_ERR = "HTTP element FIELD_NAME is longer than the 256 allowed length.";
27
+ public final static int MAX_FIELD_VALUE_LENGTH = 80 * 1024;
28
+ public final static String MAX_FIELD_VALUE_LENGTH_ERR = "HTTP element FIELD_VALUE is longer than the 81920 allowed length.";
29
+ public final static int MAX_REQUEST_URI_LENGTH = 1024 * 12;
30
+ public final static String MAX_REQUEST_URI_LENGTH_ERR = "HTTP element REQUEST_URI is longer than the 12288 allowed length.";
31
+ public final static int MAX_FRAGMENT_LENGTH = 1024;
32
+ public final static String MAX_FRAGMENT_LENGTH_ERR = "HTTP element REQUEST_PATH is longer than the 1024 allowed length.";
33
+ public final static int MAX_REQUEST_PATH_LENGTH = 2048;
34
+ public final static String MAX_REQUEST_PATH_LENGTH_ERR = "HTTP element REQUEST_PATH is longer than the 2048 allowed length.";
35
+ public final static int MAX_QUERY_STRING_LENGTH = 1024 * 10;
36
+ public final static String MAX_QUERY_STRING_LENGTH_ERR = "HTTP element QUERY_STRING is longer than the 10240 allowed length.";
37
+ public final static int MAX_HEADER_LENGTH = 1024 * (80 + 32);
38
+ public final static String MAX_HEADER_LENGTH_ERR = "HTTP element HEADER is longer than the 114688 allowed length.";
39
+
40
+
41
+ private static ObjectAllocator ALLOCATOR = new ObjectAllocator() {
42
+ public IRubyObject allocate(Ruby runtime, RubyClass klass) {
43
+ return new Http11(runtime, klass);
44
+ }
45
+ };
46
+
47
+ public static void createHttp11(Ruby runtime) {
48
+ RubyModule mPuma = runtime.defineModule("Puma");
49
+ mPuma.defineClassUnder("HttpParserError",runtime.getClass("IOError"),runtime.getClass("IOError").getAllocator());
50
+
51
+ RubyClass cHttpParser = mPuma.defineClassUnder("HttpParser",runtime.getObject(),ALLOCATOR);
52
+ cHttpParser.defineAnnotatedMethods(Http11.class);
53
+ }
54
+
55
+ private Ruby runtime;
56
+ private RubyClass eHttpParserError;
57
+ private Http11Parser hp;
58
+ private RubyString body;
59
+
60
+ public Http11(Ruby runtime, RubyClass clazz) {
61
+ super(runtime,clazz);
62
+ this.runtime = runtime;
63
+ this.eHttpParserError = (RubyClass)runtime.getModule("Puma").getConstant("HttpParserError");
64
+ this.hp = new Http11Parser();
65
+ this.hp.parser.http_field = http_field;
66
+ this.hp.parser.request_method = request_method;
67
+ this.hp.parser.request_uri = request_uri;
68
+ this.hp.parser.fragment = fragment;
69
+ this.hp.parser.request_path = request_path;
70
+ this.hp.parser.query_string = query_string;
71
+ this.hp.parser.http_version = http_version;
72
+ this.hp.parser.header_done = header_done;
73
+ this.hp.parser.init();
74
+ }
75
+
76
+ public void validateMaxLength(int len, int max, String msg) {
77
+ if(len>max) {
78
+ throw new RaiseException(runtime, eHttpParserError, msg, true);
79
+ }
80
+ }
81
+
82
+ private Http11Parser.FieldCB http_field = new Http11Parser.FieldCB() {
83
+ public void call(Object data, int field, int flen, int value, int vlen) {
84
+ RubyHash req = (RubyHash)data;
85
+ RubyString f;
86
+ IRubyObject v;
87
+ validateMaxLength(flen, MAX_FIELD_NAME_LENGTH, MAX_FIELD_NAME_LENGTH_ERR);
88
+ validateMaxLength(vlen, MAX_FIELD_VALUE_LENGTH, MAX_FIELD_VALUE_LENGTH_ERR);
89
+
90
+ ByteList b = new ByteList(Http11.this.hp.parser.buffer,field,flen);
91
+ for(int i = 0,j = b.length();i<j;i++) {
92
+ if((b.get(i) & 0xFF) == '-') {
93
+ b.set(i, (byte)'_');
94
+ } else {
95
+ b.set(i, (byte)Character.toUpperCase((char)b.get(i)));
96
+ }
97
+ }
98
+
99
+ String as = b.toString();
100
+
101
+ if(as.equals("CONTENT_LENGTH") || as.equals("CONTENT_TYPE")) {
102
+ f = RubyString.newString(runtime, b);
103
+ } else {
104
+ f = RubyString.newString(runtime, "HTTP_");
105
+ f.cat(b);
106
+ }
107
+
108
+ b = new ByteList(Http11.this.hp.parser.buffer, value, vlen);
109
+ v = req.op_aref(req.getRuntime().getCurrentContext(), f);
110
+ if (v.isNil()) {
111
+ req.op_aset(req.getRuntime().getCurrentContext(), f, RubyString.newString(runtime, b));
112
+ } else {
113
+ RubyString vs = v.convertToString();
114
+ vs.cat(RubyString.newString(runtime, ", "));
115
+ vs.cat(b);
116
+ }
117
+ }
118
+ };
119
+
120
+ private Http11Parser.ElementCB request_method = new Http11Parser.ElementCB() {
121
+ public void call(Object data, int at, int length) {
122
+ RubyHash req = (RubyHash)data;
123
+ RubyString val = RubyString.newString(runtime,new ByteList(hp.parser.buffer,at,length));
124
+ req.op_aset(req.getRuntime().getCurrentContext(), runtime.newString("REQUEST_METHOD"),val);
125
+ }
126
+ };
127
+
128
+ private Http11Parser.ElementCB request_uri = new Http11Parser.ElementCB() {
129
+ public void call(Object data, int at, int length) {
130
+ RubyHash req = (RubyHash)data;
131
+ validateMaxLength(length, MAX_REQUEST_URI_LENGTH, MAX_REQUEST_URI_LENGTH_ERR);
132
+ RubyString val = RubyString.newString(runtime,new ByteList(hp.parser.buffer,at,length));
133
+ req.op_aset(req.getRuntime().getCurrentContext(), runtime.newString("REQUEST_URI"),val);
134
+ }
135
+ };
136
+
137
+ private Http11Parser.ElementCB fragment = new Http11Parser.ElementCB() {
138
+ public void call(Object data, int at, int length) {
139
+ RubyHash req = (RubyHash)data;
140
+ validateMaxLength(length, MAX_FRAGMENT_LENGTH, MAX_FRAGMENT_LENGTH_ERR);
141
+ RubyString val = RubyString.newString(runtime,new ByteList(hp.parser.buffer,at,length));
142
+ req.op_aset(req.getRuntime().getCurrentContext(), runtime.newString("FRAGMENT"),val);
143
+ }
144
+ };
145
+
146
+ private Http11Parser.ElementCB request_path = new Http11Parser.ElementCB() {
147
+ public void call(Object data, int at, int length) {
148
+ RubyHash req = (RubyHash)data;
149
+ validateMaxLength(length, MAX_REQUEST_PATH_LENGTH, MAX_REQUEST_PATH_LENGTH_ERR);
150
+ RubyString val = RubyString.newString(runtime,new ByteList(hp.parser.buffer,at,length));
151
+ req.op_aset(req.getRuntime().getCurrentContext(), runtime.newString("REQUEST_PATH"),val);
152
+ }
153
+ };
154
+
155
+ private Http11Parser.ElementCB query_string = new Http11Parser.ElementCB() {
156
+ public void call(Object data, int at, int length) {
157
+ RubyHash req = (RubyHash)data;
158
+ validateMaxLength(length, MAX_QUERY_STRING_LENGTH, MAX_QUERY_STRING_LENGTH_ERR);
159
+ RubyString val = RubyString.newString(runtime,new ByteList(hp.parser.buffer,at,length));
160
+ req.op_aset(req.getRuntime().getCurrentContext(), runtime.newString("QUERY_STRING"),val);
161
+ }
162
+ };
163
+
164
+ private Http11Parser.ElementCB http_version = new Http11Parser.ElementCB() {
165
+ public void call(Object data, int at, int length) {
166
+ RubyHash req = (RubyHash)data;
167
+ RubyString val = RubyString.newString(runtime,new ByteList(hp.parser.buffer,at,length));
168
+ req.op_aset(req.getRuntime().getCurrentContext(), runtime.newString("HTTP_VERSION"),val);
169
+ }
170
+ };
171
+
172
+ private Http11Parser.ElementCB header_done = new Http11Parser.ElementCB() {
173
+ public void call(Object data, int at, int length) {
174
+ body = RubyString.newString(runtime, new ByteList(hp.parser.buffer, at, length));
175
+ }
176
+ };
177
+
178
+ @JRubyMethod
179
+ public IRubyObject initialize() {
180
+ this.hp.parser.init();
181
+ return this;
182
+ }
183
+
184
+ @JRubyMethod
185
+ public IRubyObject reset() {
186
+ this.hp.parser.init();
187
+ return runtime.getNil();
188
+ }
189
+
190
+ @JRubyMethod
191
+ public IRubyObject finish() {
192
+ this.hp.finish();
193
+ return this.hp.is_finished() ? runtime.getTrue() : runtime.getFalse();
194
+ }
195
+
196
+ @JRubyMethod
197
+ public IRubyObject execute(IRubyObject req_hash, IRubyObject data, IRubyObject start) {
198
+ int from = 0;
199
+ from = RubyNumeric.fix2int(start);
200
+ ByteList d = ((RubyString)data).getByteList();
201
+ if(from >= d.length()) {
202
+ throw new RaiseException(runtime, eHttpParserError, "Requested start is after data buffer end.", true);
203
+ } else {
204
+ this.hp.parser.data = req_hash;
205
+ this.hp.execute(d,from);
206
+ validateMaxLength(this.hp.parser.nread,MAX_HEADER_LENGTH, MAX_HEADER_LENGTH_ERR);
207
+ if(this.hp.has_error()) {
208
+ throw new RaiseException(runtime, eHttpParserError, "Invalid HTTP format, parsing fails.", true);
209
+ } else {
210
+ return runtime.newFixnum(this.hp.parser.nread);
211
+ }
212
+ }
213
+ }
214
+
215
+ @JRubyMethod(name = "error?")
216
+ public IRubyObject has_error() {
217
+ return this.hp.has_error() ? runtime.getTrue() : runtime.getFalse();
218
+ }
219
+
220
+ @JRubyMethod(name = "finished?")
221
+ public IRubyObject is_finished() {
222
+ return this.hp.is_finished() ? runtime.getTrue() : runtime.getFalse();
223
+ }
224
+
225
+ @JRubyMethod
226
+ public IRubyObject nread() {
227
+ return runtime.newFixnum(this.hp.parser.nread);
228
+ }
229
+
230
+ @JRubyMethod
231
+ public IRubyObject body() {
232
+ return body;
233
+ }
234
+ }// Http11
@@ -0,0 +1,473 @@
1
+
2
+ // line 1 "ext/puma_http11/http11_parser.java.rl"
3
+ package org.jruby.puma;
4
+
5
+ import org.jruby.util.ByteList;
6
+
7
+ public class Http11Parser {
8
+
9
+ /** Machine **/
10
+
11
+
12
+ // line 65 "ext/puma_http11/http11_parser.java.rl"
13
+
14
+
15
+ /** Data **/
16
+
17
+ // line 18 "ext/puma_http11/org/jruby/puma/Http11Parser.java"
18
+ private static byte[] init__puma_parser_actions_0()
19
+ {
20
+ return new byte [] {
21
+ 0, 1, 0, 1, 2, 1, 3, 1, 4, 1, 5, 1,
22
+ 6, 1, 7, 1, 8, 1, 9, 1, 11, 1, 12, 1,
23
+ 13, 2, 0, 8, 2, 1, 2, 2, 4, 5, 2, 10,
24
+ 7, 2, 12, 7, 3, 9, 10, 7
25
+ };
26
+ }
27
+
28
+ private static final byte _puma_parser_actions[] = init__puma_parser_actions_0();
29
+
30
+
31
+ private static short[] init__puma_parser_key_offsets_0()
32
+ {
33
+ return new short [] {
34
+ 0, 0, 8, 17, 27, 29, 30, 31, 32, 33, 34, 36,
35
+ 39, 41, 44, 45, 61, 62, 78, 80, 81, 89, 97, 107,
36
+ 115, 125, 134, 142, 150, 159, 168, 177, 186, 195, 204, 213,
37
+ 222, 231, 240, 249, 258, 267, 276, 285, 294, 303, 312, 313
38
+ };
39
+ }
40
+
41
+ private static final short _puma_parser_key_offsets[] = init__puma_parser_key_offsets_0();
42
+
43
+
44
+ private static char[] init__puma_parser_trans_keys_0()
45
+ {
46
+ return new char [] {
47
+ 36, 95, 45, 46, 48, 57, 65, 90, 32, 36, 95, 45,
48
+ 46, 48, 57, 65, 90, 42, 43, 47, 58, 45, 57, 65,
49
+ 90, 97, 122, 32, 35, 72, 84, 84, 80, 47, 48, 57,
50
+ 46, 48, 57, 48, 57, 13, 48, 57, 10, 13, 33, 124,
51
+ 126, 35, 39, 42, 43, 45, 46, 48, 57, 65, 90, 94,
52
+ 122, 10, 33, 58, 124, 126, 35, 39, 42, 43, 45, 46,
53
+ 48, 57, 65, 90, 94, 122, 13, 32, 13, 32, 60, 62,
54
+ 127, 0, 31, 34, 35, 32, 60, 62, 127, 0, 31, 34,
55
+ 35, 43, 58, 45, 46, 48, 57, 65, 90, 97, 122, 32,
56
+ 34, 35, 60, 62, 127, 0, 31, 32, 34, 35, 59, 60,
57
+ 62, 63, 127, 0, 31, 32, 34, 35, 60, 62, 63, 127,
58
+ 0, 31, 32, 34, 35, 60, 62, 127, 0, 31, 32, 34,
59
+ 35, 60, 62, 127, 0, 31, 32, 36, 95, 45, 46, 48,
60
+ 57, 65, 90, 32, 36, 95, 45, 46, 48, 57, 65, 90,
61
+ 32, 36, 95, 45, 46, 48, 57, 65, 90, 32, 36, 95,
62
+ 45, 46, 48, 57, 65, 90, 32, 36, 95, 45, 46, 48,
63
+ 57, 65, 90, 32, 36, 95, 45, 46, 48, 57, 65, 90,
64
+ 32, 36, 95, 45, 46, 48, 57, 65, 90, 32, 36, 95,
65
+ 45, 46, 48, 57, 65, 90, 32, 36, 95, 45, 46, 48,
66
+ 57, 65, 90, 32, 36, 95, 45, 46, 48, 57, 65, 90,
67
+ 32, 36, 95, 45, 46, 48, 57, 65, 90, 32, 36, 95,
68
+ 45, 46, 48, 57, 65, 90, 32, 36, 95, 45, 46, 48,
69
+ 57, 65, 90, 32, 36, 95, 45, 46, 48, 57, 65, 90,
70
+ 32, 36, 95, 45, 46, 48, 57, 65, 90, 32, 36, 95,
71
+ 45, 46, 48, 57, 65, 90, 32, 36, 95, 45, 46, 48,
72
+ 57, 65, 90, 32, 36, 95, 45, 46, 48, 57, 65, 90,
73
+ 32, 0
74
+ };
75
+ }
76
+
77
+ private static final char _puma_parser_trans_keys[] = init__puma_parser_trans_keys_0();
78
+
79
+
80
+ private static byte[] init__puma_parser_single_lengths_0()
81
+ {
82
+ return new byte [] {
83
+ 0, 2, 3, 4, 2, 1, 1, 1, 1, 1, 0, 1,
84
+ 0, 1, 1, 4, 1, 4, 2, 1, 4, 4, 2, 6,
85
+ 8, 7, 6, 6, 3, 3, 3, 3, 3, 3, 3, 3,
86
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 0
87
+ };
88
+ }
89
+
90
+ private static final byte _puma_parser_single_lengths[] = init__puma_parser_single_lengths_0();
91
+
92
+
93
+ private static byte[] init__puma_parser_range_lengths_0()
94
+ {
95
+ return new byte [] {
96
+ 0, 3, 3, 3, 0, 0, 0, 0, 0, 0, 1, 1,
97
+ 1, 1, 0, 6, 0, 6, 0, 0, 2, 2, 4, 1,
98
+ 1, 1, 1, 1, 3, 3, 3, 3, 3, 3, 3, 3,
99
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0
100
+ };
101
+ }
102
+
103
+ private static final byte _puma_parser_range_lengths[] = init__puma_parser_range_lengths_0();
104
+
105
+
106
+ private static short[] init__puma_parser_index_offsets_0()
107
+ {
108
+ return new short [] {
109
+ 0, 0, 6, 13, 21, 24, 26, 28, 30, 32, 34, 36,
110
+ 39, 41, 44, 46, 57, 59, 70, 73, 75, 82, 89, 96,
111
+ 104, 114, 123, 131, 139, 146, 153, 160, 167, 174, 181, 188,
112
+ 195, 202, 209, 216, 223, 230, 237, 244, 251, 258, 265, 267
113
+ };
114
+ }
115
+
116
+ private static final short _puma_parser_index_offsets[] = init__puma_parser_index_offsets_0();
117
+
118
+
119
+ private static byte[] init__puma_parser_indicies_0()
120
+ {
121
+ return new byte [] {
122
+ 0, 0, 0, 0, 0, 1, 2, 3, 3, 3, 3, 3,
123
+ 1, 4, 5, 6, 7, 5, 5, 5, 1, 8, 9, 1,
124
+ 10, 1, 11, 1, 12, 1, 13, 1, 14, 1, 15, 1,
125
+ 16, 15, 1, 17, 1, 18, 17, 1, 19, 1, 20, 21,
126
+ 21, 21, 21, 21, 21, 21, 21, 21, 1, 22, 1, 23,
127
+ 24, 23, 23, 23, 23, 23, 23, 23, 23, 1, 26, 27,
128
+ 25, 29, 28, 30, 1, 1, 1, 1, 1, 31, 32, 1,
129
+ 1, 1, 1, 1, 33, 34, 35, 34, 34, 34, 34, 1,
130
+ 8, 1, 9, 1, 1, 1, 1, 35, 36, 1, 38, 39,
131
+ 1, 1, 40, 1, 1, 37, 8, 1, 9, 1, 1, 42,
132
+ 1, 1, 41, 43, 1, 45, 1, 1, 1, 1, 44, 46,
133
+ 1, 48, 1, 1, 1, 1, 47, 2, 49, 49, 49, 49,
134
+ 49, 1, 2, 50, 50, 50, 50, 50, 1, 2, 51, 51,
135
+ 51, 51, 51, 1, 2, 52, 52, 52, 52, 52, 1, 2,
136
+ 53, 53, 53, 53, 53, 1, 2, 54, 54, 54, 54, 54,
137
+ 1, 2, 55, 55, 55, 55, 55, 1, 2, 56, 56, 56,
138
+ 56, 56, 1, 2, 57, 57, 57, 57, 57, 1, 2, 58,
139
+ 58, 58, 58, 58, 1, 2, 59, 59, 59, 59, 59, 1,
140
+ 2, 60, 60, 60, 60, 60, 1, 2, 61, 61, 61, 61,
141
+ 61, 1, 2, 62, 62, 62, 62, 62, 1, 2, 63, 63,
142
+ 63, 63, 63, 1, 2, 64, 64, 64, 64, 64, 1, 2,
143
+ 65, 65, 65, 65, 65, 1, 2, 66, 66, 66, 66, 66,
144
+ 1, 2, 1, 1, 0
145
+ };
146
+ }
147
+
148
+ private static final byte _puma_parser_indicies[] = init__puma_parser_indicies_0();
149
+
150
+
151
+ private static byte[] init__puma_parser_trans_targs_0()
152
+ {
153
+ return new byte [] {
154
+ 2, 0, 3, 28, 4, 22, 24, 23, 5, 20, 6, 7,
155
+ 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 47, 17,
156
+ 18, 19, 14, 18, 19, 14, 5, 21, 5, 21, 22, 23,
157
+ 5, 24, 20, 25, 26, 25, 26, 5, 27, 20, 5, 27,
158
+ 20, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
159
+ 40, 41, 42, 43, 44, 45, 46
160
+ };
161
+ }
162
+
163
+ private static final byte _puma_parser_trans_targs[] = init__puma_parser_trans_targs_0();
164
+
165
+
166
+ private static byte[] init__puma_parser_trans_actions_0()
167
+ {
168
+ return new byte [] {
169
+ 1, 0, 11, 0, 1, 1, 1, 1, 13, 13, 1, 0,
170
+ 0, 0, 0, 0, 0, 0, 19, 0, 0, 28, 23, 3,
171
+ 5, 7, 31, 7, 0, 9, 25, 1, 15, 0, 0, 0,
172
+ 37, 0, 37, 21, 21, 0, 0, 40, 17, 40, 34, 0,
173
+ 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
174
+ 0, 0, 0, 0, 0, 0, 0
175
+ };
176
+ }
177
+
178
+ private static final byte _puma_parser_trans_actions[] = init__puma_parser_trans_actions_0();
179
+
180
+
181
+ static final int puma_parser_start = 1;
182
+ static final int puma_parser_first_final = 47;
183
+ static final int puma_parser_error = 0;
184
+
185
+ static final int puma_parser_en_main = 1;
186
+
187
+
188
+ // line 69 "ext/puma_http11/http11_parser.java.rl"
189
+
190
+ public static interface ElementCB {
191
+ public void call(Object data, int at, int length);
192
+ }
193
+
194
+ public static interface FieldCB {
195
+ public void call(Object data, 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
+ Object data;
209
+ ByteList buffer;
210
+
211
+ public FieldCB http_field;
212
+ public ElementCB request_method;
213
+ public ElementCB request_uri;
214
+ public ElementCB fragment;
215
+ public ElementCB request_path;
216
+ public ElementCB query_string;
217
+ public ElementCB http_version;
218
+ public ElementCB header_done;
219
+
220
+ public void init() {
221
+ cs = 0;
222
+
223
+
224
+ // line 225 "ext/puma_http11/org/jruby/puma/Http11Parser.java"
225
+ {
226
+ cs = puma_parser_start;
227
+ }
228
+
229
+ // line 104 "ext/puma_http11/http11_parser.java.rl"
230
+
231
+ body_start = 0;
232
+ content_len = 0;
233
+ mark = 0;
234
+ nread = 0;
235
+ field_len = 0;
236
+ field_start = 0;
237
+ }
238
+ }
239
+
240
+ public final HttpParser parser = new HttpParser();
241
+
242
+ public int execute(ByteList buffer, int off) {
243
+ int p, pe;
244
+ int cs = parser.cs;
245
+ int len = buffer.length();
246
+ assert off<=len : "offset past end of buffer";
247
+
248
+ p = off;
249
+ pe = len;
250
+ // get a copy of the bytes, since it may not start at 0
251
+ // FIXME: figure out how to just use the bytes in-place
252
+ byte[] data = buffer.bytes();
253
+ parser.buffer = buffer;
254
+
255
+
256
+ // line 257 "ext/puma_http11/org/jruby/puma/Http11Parser.java"
257
+ {
258
+ int _klen;
259
+ int _trans = 0;
260
+ int _acts;
261
+ int _nacts;
262
+ int _keys;
263
+ int _goto_targ = 0;
264
+
265
+ _goto: while (true) {
266
+ switch ( _goto_targ ) {
267
+ case 0:
268
+ if ( p == pe ) {
269
+ _goto_targ = 4;
270
+ continue _goto;
271
+ }
272
+ if ( cs == 0 ) {
273
+ _goto_targ = 5;
274
+ continue _goto;
275
+ }
276
+ case 1:
277
+ _match: do {
278
+ _keys = _puma_parser_key_offsets[cs];
279
+ _trans = _puma_parser_index_offsets[cs];
280
+ _klen = _puma_parser_single_lengths[cs];
281
+ if ( _klen > 0 ) {
282
+ int _lower = _keys;
283
+ int _mid;
284
+ int _upper = _keys + _klen - 1;
285
+ while (true) {
286
+ if ( _upper < _lower )
287
+ break;
288
+
289
+ _mid = _lower + ((_upper-_lower) >> 1);
290
+ if ( data[p] < _puma_parser_trans_keys[_mid] )
291
+ _upper = _mid - 1;
292
+ else if ( data[p] > _puma_parser_trans_keys[_mid] )
293
+ _lower = _mid + 1;
294
+ else {
295
+ _trans += (_mid - _keys);
296
+ break _match;
297
+ }
298
+ }
299
+ _keys += _klen;
300
+ _trans += _klen;
301
+ }
302
+
303
+ _klen = _puma_parser_range_lengths[cs];
304
+ if ( _klen > 0 ) {
305
+ int _lower = _keys;
306
+ int _mid;
307
+ int _upper = _keys + (_klen<<1) - 2;
308
+ while (true) {
309
+ if ( _upper < _lower )
310
+ break;
311
+
312
+ _mid = _lower + (((_upper-_lower) >> 1) & ~1);
313
+ if ( data[p] < _puma_parser_trans_keys[_mid] )
314
+ _upper = _mid - 2;
315
+ else if ( data[p] > _puma_parser_trans_keys[_mid+1] )
316
+ _lower = _mid + 2;
317
+ else {
318
+ _trans += ((_mid - _keys)>>1);
319
+ break _match;
320
+ }
321
+ }
322
+ _trans += _klen;
323
+ }
324
+ } while (false);
325
+
326
+ _trans = _puma_parser_indicies[_trans];
327
+ cs = _puma_parser_trans_targs[_trans];
328
+
329
+ if ( _puma_parser_trans_actions[_trans] != 0 ) {
330
+ _acts = _puma_parser_trans_actions[_trans];
331
+ _nacts = (int) _puma_parser_actions[_acts++];
332
+ while ( _nacts-- > 0 )
333
+ {
334
+ switch ( _puma_parser_actions[_acts++] )
335
+ {
336
+ case 0:
337
+ // line 13 "ext/puma_http11/http11_parser.java.rl"
338
+ {parser.mark = p; }
339
+ break;
340
+ case 1:
341
+ // line 15 "ext/puma_http11/http11_parser.java.rl"
342
+ { parser.field_start = p; }
343
+ break;
344
+ case 2:
345
+ // line 16 "ext/puma_http11/http11_parser.java.rl"
346
+ { /* FIXME stub */ }
347
+ break;
348
+ case 3:
349
+ // line 17 "ext/puma_http11/http11_parser.java.rl"
350
+ {
351
+ parser.field_len = p-parser.field_start;
352
+ }
353
+ break;
354
+ case 4:
355
+ // line 21 "ext/puma_http11/http11_parser.java.rl"
356
+ { parser.mark = p; }
357
+ break;
358
+ case 5:
359
+ // line 22 "ext/puma_http11/http11_parser.java.rl"
360
+ {
361
+ if(parser.http_field != null) {
362
+ parser.http_field.call(parser.data, parser.field_start, parser.field_len, parser.mark, p-parser.mark);
363
+ }
364
+ }
365
+ break;
366
+ case 6:
367
+ // line 27 "ext/puma_http11/http11_parser.java.rl"
368
+ {
369
+ if(parser.request_method != null)
370
+ parser.request_method.call(parser.data, parser.mark, p-parser.mark);
371
+ }
372
+ break;
373
+ case 7:
374
+ // line 31 "ext/puma_http11/http11_parser.java.rl"
375
+ {
376
+ if(parser.request_uri != null)
377
+ parser.request_uri.call(parser.data, parser.mark, p-parser.mark);
378
+ }
379
+ break;
380
+ case 8:
381
+ // line 35 "ext/puma_http11/http11_parser.java.rl"
382
+ {
383
+ if(parser.fragment != null)
384
+ parser.fragment.call(parser.data, parser.mark, p-parser.mark);
385
+ }
386
+ break;
387
+ case 9:
388
+ // line 40 "ext/puma_http11/http11_parser.java.rl"
389
+ {parser.query_start = p; }
390
+ break;
391
+ case 10:
392
+ // line 41 "ext/puma_http11/http11_parser.java.rl"
393
+ {
394
+ if(parser.query_string != null)
395
+ parser.query_string.call(parser.data, parser.query_start, p-parser.query_start);
396
+ }
397
+ break;
398
+ case 11:
399
+ // line 46 "ext/puma_http11/http11_parser.java.rl"
400
+ {
401
+ if(parser.http_version != null)
402
+ parser.http_version.call(parser.data, parser.mark, p-parser.mark);
403
+ }
404
+ break;
405
+ case 12:
406
+ // line 51 "ext/puma_http11/http11_parser.java.rl"
407
+ {
408
+ if(parser.request_path != null)
409
+ parser.request_path.call(parser.data, parser.mark, p-parser.mark);
410
+ }
411
+ break;
412
+ case 13:
413
+ // line 56 "ext/puma_http11/http11_parser.java.rl"
414
+ {
415
+ parser.body_start = p + 1;
416
+ if(parser.header_done != null)
417
+ parser.header_done.call(parser.data, p + 1, pe - p - 1);
418
+ { p += 1; _goto_targ = 5; if (true) continue _goto;}
419
+ }
420
+ break;
421
+ // line 422 "ext/puma_http11/org/jruby/puma/Http11Parser.java"
422
+ }
423
+ }
424
+ }
425
+
426
+ case 2:
427
+ if ( cs == 0 ) {
428
+ _goto_targ = 5;
429
+ continue _goto;
430
+ }
431
+ if ( ++p != pe ) {
432
+ _goto_targ = 1;
433
+ continue _goto;
434
+ }
435
+ case 4:
436
+ case 5:
437
+ }
438
+ break; }
439
+ }
440
+
441
+ // line 130 "ext/puma_http11/http11_parser.java.rl"
442
+
443
+ parser.cs = cs;
444
+ parser.nread += (p - off);
445
+
446
+ assert p <= pe : "buffer overflow after parsing execute";
447
+ assert parser.nread <= len : "nread longer than length";
448
+ assert parser.body_start <= len : "body starts after buffer end";
449
+ assert parser.mark < len : "mark is after buffer end";
450
+ assert parser.field_len <= len : "field has length longer than whole buffer";
451
+ assert parser.field_start < len : "field starts after buffer end";
452
+
453
+ return parser.nread;
454
+ }
455
+
456
+ public int finish() {
457
+ if(has_error()) {
458
+ return -1;
459
+ } else if(is_finished()) {
460
+ return 1;
461
+ } else {
462
+ return 0;
463
+ }
464
+ }
465
+
466
+ public boolean has_error() {
467
+ return parser.cs == puma_parser_error;
468
+ }
469
+
470
+ public boolean is_finished() {
471
+ return parser.cs == puma_parser_first_final;
472
+ }
473
+ }