mongrel 1.1.5 → 1.2.0.pre2

Sign up to get free protection for your applications and to get access to all the features.
@@ -13,6 +13,7 @@ public class Http11Parser {
13
13
  action mark {parser.mark = fpc; }
14
14
 
15
15
  action start_field { parser.field_start = fpc; }
16
+ action snake_upcase_field { /* FIXME stub */ }
16
17
  action write_field {
17
18
  parser.field_len = fpc-parser.field_start;
18
19
  }
@@ -115,12 +116,12 @@ public class Http11Parser {
115
116
  public int execute(ByteList buffer, int off) {
116
117
  int p, pe;
117
118
  int cs = parser.cs;
118
- int len = buffer.realSize;
119
+ int len = buffer.length();
119
120
  assert off<=len : "offset past end of buffer";
120
121
 
121
122
  p = off;
122
123
  pe = len;
123
- byte[] data = buffer.bytes;
124
+ byte[] data = buffer.unsafeBytes();
124
125
  parser.buffer = buffer;
125
126
 
126
127
  %% write exec;
@@ -135,22 +136,10 @@ public class Http11Parser {
135
136
  assert parser.field_len <= len : "field has length longer than whole buffer";
136
137
  assert parser.field_start < len : "field starts after buffer end";
137
138
 
138
- if(parser.body_start>0) {
139
- /* final \r\n combo encountered so stop right here */
140
- %%write eof;
141
- parser.nread++;
142
- }
143
-
144
139
  return parser.nread;
145
140
  }
146
141
 
147
142
  public int finish() {
148
- int cs = parser.cs;
149
-
150
- %%write eof;
151
-
152
- parser.cs = cs;
153
-
154
143
  if(has_error()) {
155
144
  return -1;
156
145
  } else if(is_finished()) {
@@ -9,6 +9,18 @@
9
9
  #include <ctype.h>
10
10
  #include <string.h>
11
11
 
12
+ /*
13
+ * capitalizes all lower-case ASCII characters,
14
+ * converts dashes to underscores.
15
+ */
16
+ static void snake_upcase_char(char *c)
17
+ {
18
+ if (*c >= 'a' && *c <= 'z')
19
+ *c &= ~0x20;
20
+ else if (*c == '-')
21
+ *c = '_';
22
+ }
23
+
12
24
  #define LEN(AT, FPC) (FPC - buffer - parser->AT)
13
25
  #define MARK(M,FPC) (parser->M = (FPC) - buffer)
14
26
  #define PTR_TO(F) (buffer + parser->F)
@@ -23,12 +35,13 @@
23
35
 
24
36
 
25
37
  action start_field { MARK(field_start, fpc); }
38
+ action snake_upcase_field { snake_upcase_char((char *)fpc); }
26
39
  action write_field {
27
40
  parser->field_len = LEN(field_start, fpc);
28
41
  }
29
42
 
30
43
  action start_value { MARK(mark, fpc); }
31
- action write_value {
44
+ action write_value {
32
45
  if(parser->http_field != NULL) {
33
46
  parser->http_field(parser->data, PTR_TO(field_start), parser->field_len, PTR_TO(mark), LEN(mark, fpc));
34
47
  }
@@ -41,7 +54,7 @@
41
54
  if(parser->request_uri != NULL)
42
55
  parser->request_uri(parser->data, PTR_TO(mark), LEN(mark, fpc));
43
56
  }
44
- action fragment {
57
+ action fragment {
45
58
  if(parser->fragment != NULL)
46
59
  parser->fragment(parser->data, PTR_TO(mark), LEN(mark, fpc));
47
60
  }
@@ -101,13 +114,13 @@ size_t http_parser_execute(http_parser *parser, const char *buffer, size_t len,
101
114
  p = buffer+off;
102
115
  pe = buffer+len;
103
116
 
104
- assert(*pe == '\0' && "pointer does not end on NUL");
117
+ /* assert(*pe == '\0' && "pointer does not end on NUL"); */
105
118
  assert(pe - p == len - off && "pointers aren't same distance");
106
119
 
107
-
108
120
  %% write exec;
109
121
 
110
- parser->cs = cs;
122
+ if (!http_parser_has_error(parser))
123
+ parser->cs = cs;
111
124
  parser->nread += p - (buffer + off);
112
125
 
113
126
  assert(p <= pe && "buffer overflow after parsing execute");
@@ -117,23 +130,11 @@ size_t http_parser_execute(http_parser *parser, const char *buffer, size_t len,
117
130
  assert(parser->field_len <= len && "field has length longer than whole buffer");
118
131
  assert(parser->field_start < len && "field starts after buffer end");
119
132
 
120
- if(parser->body_start) {
121
- /* final \r\n combo encountered so stop right here */
122
- %%write eof;
123
- parser->nread++;
124
- }
125
-
126
133
  return(parser->nread);
127
134
  }
128
135
 
129
136
  int http_parser_finish(http_parser *parser)
130
137
  {
131
- int cs = parser->cs;
132
-
133
- %%write eof;
134
-
135
- parser->cs = cs;
136
-
137
138
  if (http_parser_has_error(parser) ) {
138
139
  return -1;
139
140
  } else if (http_parser_is_finished(parser) ) {
@@ -148,5 +149,5 @@ int http_parser_has_error(http_parser *parser) {
148
149
  }
149
150
 
150
151
  int http_parser_is_finished(http_parser *parser) {
151
- return parser->cs == http_parser_first_final;
152
+ return parser->cs >= http_parser_first_final;
152
153
  }
@@ -41,7 +41,7 @@
41
41
  HTTP_Version = ( "HTTP/" http_number ) >mark %http_version ;
42
42
  Request_Line = ( Method " " Request_URI ("#" Fragment){0,1} " " HTTP_Version CRLF ) ;
43
43
 
44
- field_name = ( token -- ":" )+ >start_field %write_field;
44
+ field_name = ( token -- ":" )+ >start_field $snake_upcase_field %write_field;
45
45
 
46
46
  field_value = any* >start_value %write_value;
47
47
 
@@ -1,30 +1,3 @@
1
- /***** BEGIN LICENSE BLOCK *****
2
- * Version: CPL 1.0/GPL 2.0/LGPL 2.1
3
- *
4
- * The contents of this file are subject to the Common Public
5
- * License Version 1.0 (the "License"); you may not use this file
6
- * except in compliance with the License. You may obtain a copy of
7
- * the License at http://www.eclipse.org/legal/cpl-v10.html
8
- *
9
- * Software distributed under the License is distributed on an "AS
10
- * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
11
- * implied. See the License for the specific language governing
12
- * rights and limitations under the License.
13
- *
14
- * Copyright (C) 2007 Ola Bini <ola@ologix.com>
15
- *
16
- * Alternatively, the contents of this file may be used under the terms of
17
- * either of the GNU General Public License Version 2 or later (the "GPL"),
18
- * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
19
- * in which case the provisions of the GPL or the LGPL are applicable instead
20
- * of those above. If you wish to allow use of your version of this file only
21
- * under the terms of either the GPL or the LGPL, and not to allow others to
22
- * use your version of this file under the terms of the CPL, indicate your
23
- * decision by deleting the provisions above and replace them with the notice
24
- * and other provisions required by the GPL or the LGPL. If you do not delete
25
- * the provisions above, a recipient may use your version of this file under
26
- * the terms of any one of the CPL, the GPL or the LGPL.
27
- ***** END LICENSE BLOCK *****/
28
1
  package org.jruby.mongrel;
29
2
 
30
3
  import org.jruby.Ruby;
@@ -35,8 +8,10 @@ import org.jruby.RubyNumeric;
35
8
  import org.jruby.RubyObject;
36
9
  import org.jruby.RubyString;
37
10
 
38
- import org.jruby.runtime.CallbackFactory;
11
+ import org.jruby.anno.JRubyMethod;
12
+
39
13
  import org.jruby.runtime.ObjectAllocator;
14
+ import org.jruby.runtime.ThreadContext;
40
15
  import org.jruby.runtime.builtin.IRubyObject;
41
16
 
42
17
  import org.jruby.exceptions.RaiseException;
@@ -73,16 +48,8 @@ public class Http11 extends RubyObject {
73
48
  RubyModule mMongrel = runtime.defineModule("Mongrel");
74
49
  mMongrel.defineClassUnder("HttpParserError",runtime.getClass("IOError"),runtime.getClass("IOError").getAllocator());
75
50
 
76
- CallbackFactory cf = runtime.callbackFactory(Http11.class);
77
-
78
51
  RubyClass cHttpParser = mMongrel.defineClassUnder("HttpParser",runtime.getObject(),ALLOCATOR);
79
- cHttpParser.defineFastMethod("initialize",cf.getFastMethod("initialize"));
80
- cHttpParser.defineFastMethod("reset",cf.getFastMethod("reset"));
81
- cHttpParser.defineFastMethod("finish",cf.getFastMethod("finish"));
82
- cHttpParser.defineFastMethod("execute",cf.getFastMethod("execute", IRubyObject.class, IRubyObject.class, IRubyObject.class));
83
- cHttpParser.defineFastMethod("error?",cf.getFastMethod("has_error"));
84
- cHttpParser.defineFastMethod("finished?",cf.getFastMethod("is_finished"));
85
- cHttpParser.defineFastMethod("nread",cf.getFastMethod("nread"));
52
+ cHttpParser.defineAnnotatedMethods(Http11.class);
86
53
  }
87
54
 
88
55
  private Ruby runtime;
@@ -121,15 +88,15 @@ public class Http11 extends RubyObject {
121
88
  v = RubyString.newString(runtime, new ByteList(Http11.this.hp.parser.buffer,value,vlen));
122
89
  f = RubyString.newString(runtime, "HTTP_");
123
90
  ByteList b = new ByteList(Http11.this.hp.parser.buffer,field,flen);
124
- for(int i=0,j=b.realSize;i<j;i++) {
125
- if((b.bytes[i]&0xFF) == '-') {
126
- b.bytes[i] = (byte)'_';
91
+ for(int i = 0,j = b.length();i<j;i++) {
92
+ if((b.get(i) & 0xFF) == '-') {
93
+ b.set(i, (byte)'_');
127
94
  } else {
128
- b.bytes[i] = (byte)Character.toUpperCase((char)b.bytes[i]);
95
+ b.set(i, (byte)Character.toUpperCase((char)b.get(i)));
129
96
  }
130
97
  }
131
98
  f.cat(b);
132
- req.aset(f,v);
99
+ req.op_aset(req.getRuntime().getCurrentContext(), f,v);
133
100
  }
134
101
  };
135
102
 
@@ -137,7 +104,7 @@ public class Http11 extends RubyObject {
137
104
  public void call(Object data, int at, int length) {
138
105
  RubyHash req = (RubyHash)data;
139
106
  RubyString val = RubyString.newString(runtime,new ByteList(hp.parser.buffer,at,length));
140
- req.aset(runtime.newString("REQUEST_METHOD"),val);
107
+ req.op_aset(req.getRuntime().getCurrentContext(), runtime.newString("REQUEST_METHOD"),val);
141
108
  }
142
109
  };
143
110
 
@@ -146,7 +113,7 @@ public class Http11 extends RubyObject {
146
113
  RubyHash req = (RubyHash)data;
147
114
  validateMaxLength(length, MAX_REQUEST_URI_LENGTH, MAX_REQUEST_URI_LENGTH_ERR);
148
115
  RubyString val = RubyString.newString(runtime,new ByteList(hp.parser.buffer,at,length));
149
- req.aset(runtime.newString("REQUEST_URI"),val);
116
+ req.op_aset(req.getRuntime().getCurrentContext(), runtime.newString("REQUEST_URI"),val);
150
117
  }
151
118
  };
152
119
 
@@ -155,7 +122,7 @@ public class Http11 extends RubyObject {
155
122
  RubyHash req = (RubyHash)data;
156
123
  validateMaxLength(length, MAX_FRAGMENT_LENGTH, MAX_FRAGMENT_LENGTH_ERR);
157
124
  RubyString val = RubyString.newString(runtime,new ByteList(hp.parser.buffer,at,length));
158
- req.aset(runtime.newString("FRAGMENT"),val);
125
+ req.op_aset(req.getRuntime().getCurrentContext(), runtime.newString("FRAGMENT"),val);
159
126
  }
160
127
  };
161
128
 
@@ -164,7 +131,7 @@ public class Http11 extends RubyObject {
164
131
  RubyHash req = (RubyHash)data;
165
132
  validateMaxLength(length, MAX_REQUEST_PATH_LENGTH, MAX_REQUEST_PATH_LENGTH_ERR);
166
133
  RubyString val = RubyString.newString(runtime,new ByteList(hp.parser.buffer,at,length));
167
- req.aset(runtime.newString("REQUEST_PATH"),val);
134
+ req.op_aset(req.getRuntime().getCurrentContext(), runtime.newString("REQUEST_PATH"),val);
168
135
  }
169
136
  };
170
137
 
@@ -173,7 +140,7 @@ public class Http11 extends RubyObject {
173
140
  RubyHash req = (RubyHash)data;
174
141
  validateMaxLength(length, MAX_QUERY_STRING_LENGTH, MAX_QUERY_STRING_LENGTH_ERR);
175
142
  RubyString val = RubyString.newString(runtime,new ByteList(hp.parser.buffer,at,length));
176
- req.aset(runtime.newString("QUERY_STRING"),val);
143
+ req.op_aset(req.getRuntime().getCurrentContext(), runtime.newString("QUERY_STRING"),val);
177
144
  }
178
145
  };
179
146
 
@@ -181,64 +148,69 @@ public class Http11 extends RubyObject {
181
148
  public void call(Object data, int at, int length) {
182
149
  RubyHash req = (RubyHash)data;
183
150
  RubyString val = RubyString.newString(runtime,new ByteList(hp.parser.buffer,at,length));
184
- req.aset(runtime.newString("HTTP_VERSION"),val);
151
+ req.op_aset(req.getRuntime().getCurrentContext(), runtime.newString("HTTP_VERSION"),val);
185
152
  }
186
153
  };
187
154
 
188
155
  private Http11Parser.ElementCB header_done = new Http11Parser.ElementCB() {
189
156
  public void call(Object data, int at, int length) {
190
157
  RubyHash req = (RubyHash)data;
158
+ ThreadContext context = req.getRuntime().getCurrentContext();
191
159
  IRubyObject temp,ctype,clen;
192
160
 
193
- clen = req.aref(runtime.newString("HTTP_CONTENT_LENGTH"));
161
+ clen = req.op_aref(context, runtime.newString("HTTP_CONTENT_LENGTH"));
194
162
  if(!clen.isNil()) {
195
- req.aset(runtime.newString("CONTENT_LENGTH"),clen);
163
+ req.op_aset(context, runtime.newString("CONTENT_LENGTH"),clen);
196
164
  }
197
165
 
198
- ctype = req.aref(runtime.newString("HTTP_CONTENT_TYPE"));
166
+ ctype = req.op_aref(context, runtime.newString("HTTP_CONTENT_TYPE"));
199
167
  if(!ctype.isNil()) {
200
- req.aset(runtime.newString("CONTENT_TYPE"),ctype);
168
+ req.op_aset(context, runtime.newString("CONTENT_TYPE"),ctype);
201
169
  }
202
170
 
203
- req.aset(runtime.newString("GATEWAY_INTERFACE"),runtime.newString("CGI/1.2"));
204
- if(!(temp = req.aref(runtime.newString("HTTP_HOST"))).isNil()) {
171
+ req.op_aset(context, runtime.newString("GATEWAY_INTERFACE"),runtime.newString("CGI/1.2"));
172
+ if(!(temp = req.op_aref(context, runtime.newString("HTTP_HOST"))).isNil()) {
205
173
  String s = temp.toString();
206
174
  int colon = s.indexOf(':');
207
175
  if(colon != -1) {
208
- req.aset(runtime.newString("SERVER_NAME"),runtime.newString(s.substring(0,colon)));
209
- req.aset(runtime.newString("SERVER_PORT"),runtime.newString(s.substring(colon+1)));
176
+ req.op_aset(context, runtime.newString("SERVER_NAME"),runtime.newString(s.substring(0,colon)));
177
+ req.op_aset(context, runtime.newString("SERVER_PORT"),runtime.newString(s.substring(colon+1)));
210
178
  } else {
211
- req.aset(runtime.newString("SERVER_NAME"),temp);
212
- req.aset(runtime.newString("SERVER_PORT"),runtime.newString("80"));
179
+ req.op_aset(context, runtime.newString("SERVER_NAME"),temp);
180
+ req.op_aset(context, runtime.newString("SERVER_PORT"),runtime.newString("80"));
213
181
  }
214
182
  }
215
183
 
216
184
  req.setInstanceVariable("@http_body", RubyString.newString(runtime, new ByteList(hp.parser.buffer, at, length)));
217
- req.aset(runtime.newString("SERVER_PROTOCOL"),runtime.newString("HTTP/1.1"));
218
- req.aset(runtime.newString("SERVER_SOFTWARE"),runtime.newString("Mongrel 1.1.5"));
185
+ req.op_aset(context, runtime.newString("SERVER_PROTOCOL"),runtime.newString("HTTP/1.1"));
186
+ req.op_aset(context, runtime.newString("SERVER_SOFTWARE"),runtime.newString("Mongrel 1.2.0.pre2"));
219
187
  }
220
188
  };
221
189
 
190
+ @JRubyMethod
222
191
  public IRubyObject initialize() {
223
192
  this.hp.parser.init();
224
193
  return this;
225
194
  }
226
195
 
196
+ @JRubyMethod
227
197
  public IRubyObject reset() {
228
198
  this.hp.parser.init();
229
199
  return runtime.getNil();
230
200
  }
231
201
 
202
+ @JRubyMethod
232
203
  public IRubyObject finish() {
233
204
  this.hp.finish();
234
205
  return this.hp.is_finished() ? runtime.getTrue() : runtime.getFalse();
235
206
  }
236
207
 
208
+ @JRubyMethod
237
209
  public IRubyObject execute(IRubyObject req_hash, IRubyObject data, IRubyObject start) {
238
210
  int from = 0;
239
211
  from = RubyNumeric.fix2int(start);
240
212
  ByteList d = ((RubyString)data).getByteList();
241
- if(from >= d.realSize) {
213
+ if(from >= d.length()) {
242
214
  throw new RaiseException(runtime, eHttpParserError, "Requested start is after data buffer end.", true);
243
215
  } else {
244
216
  this.hp.parser.data = req_hash;
@@ -252,14 +224,17 @@ public class Http11 extends RubyObject {
252
224
  }
253
225
  }
254
226
 
227
+ @JRubyMethod(name = "error?")
255
228
  public IRubyObject has_error() {
256
229
  return this.hp.has_error() ? runtime.getTrue() : runtime.getFalse();
257
230
  }
258
231
 
232
+ @JRubyMethod(name = "finished?")
259
233
  public IRubyObject is_finished() {
260
234
  return this.hp.is_finished() ? runtime.getTrue() : runtime.getFalse();
261
235
  }
262
236
 
237
+ @JRubyMethod
263
238
  public IRubyObject nread() {
264
239
  return runtime.newFixnum(this.hp.parser.nread);
265
240
  }
@@ -0,0 +1,486 @@
1
+
2
+ // line 1 "ext/http11/http11_parser.java.rl"
3
+ package org.jruby.mongrel;
4
+
5
+ import org.jruby.util.ByteList;
6
+
7
+ public class Http11Parser {
8
+
9
+ /** Machine **/
10
+
11
+
12
+ // line 65 "ext/http11/http11_parser.java.rl"
13
+
14
+
15
+ /** Data **/
16
+
17
+ // line 18 "ext/http11/org/jruby/mongrel/Http11Parser.java"
18
+ private static byte[] init__http_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 _http_parser_actions[] = init__http_parser_actions_0();
29
+
30
+
31
+ private static short[] init__http_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, 90, 99, 105,
36
+ 111, 121, 130, 136, 142, 153, 159, 165, 175, 181, 187, 196,
37
+ 205, 211, 217, 226, 235, 244, 253, 262, 271, 280, 289, 298,
38
+ 307, 316, 325, 334, 343, 352, 361, 370, 379, 380
39
+ };
40
+ }
41
+
42
+ private static final short _http_parser_key_offsets[] = init__http_parser_key_offsets_0();
43
+
44
+
45
+ private static char[] init__http_parser_trans_keys_0()
46
+ {
47
+ return new char [] {
48
+ 36, 95, 45, 46, 48, 57, 65, 90, 32, 36, 95, 45,
49
+ 46, 48, 57, 65, 90, 42, 43, 47, 58, 45, 57, 65,
50
+ 90, 97, 122, 32, 35, 72, 84, 84, 80, 47, 48, 57,
51
+ 46, 48, 57, 48, 57, 13, 48, 57, 10, 13, 33, 124,
52
+ 126, 35, 39, 42, 43, 45, 46, 48, 57, 65, 90, 94,
53
+ 122, 10, 33, 58, 124, 126, 35, 39, 42, 43, 45, 46,
54
+ 48, 57, 65, 90, 94, 122, 13, 32, 13, 32, 37, 60,
55
+ 62, 127, 0, 31, 34, 35, 32, 37, 60, 62, 127, 0,
56
+ 31, 34, 35, 48, 57, 65, 70, 97, 102, 48, 57, 65,
57
+ 70, 97, 102, 43, 58, 45, 46, 48, 57, 65, 90, 97,
58
+ 122, 32, 34, 35, 37, 60, 62, 127, 0, 31, 48, 57,
59
+ 65, 70, 97, 102, 48, 57, 65, 70, 97, 102, 32, 34,
60
+ 35, 37, 59, 60, 62, 63, 127, 0, 31, 48, 57, 65,
61
+ 70, 97, 102, 48, 57, 65, 70, 97, 102, 32, 34, 35,
62
+ 37, 60, 62, 63, 127, 0, 31, 48, 57, 65, 70, 97,
63
+ 102, 48, 57, 65, 70, 97, 102, 32, 34, 35, 37, 60,
64
+ 62, 127, 0, 31, 32, 34, 35, 37, 60, 62, 127, 0,
65
+ 31, 48, 57, 65, 70, 97, 102, 48, 57, 65, 70, 97,
66
+ 102, 32, 36, 95, 45, 46, 48, 57, 65, 90, 32, 36,
67
+ 95, 45, 46, 48, 57, 65, 90, 32, 36, 95, 45, 46,
68
+ 48, 57, 65, 90, 32, 36, 95, 45, 46, 48, 57, 65,
69
+ 90, 32, 36, 95, 45, 46, 48, 57, 65, 90, 32, 36,
70
+ 95, 45, 46, 48, 57, 65, 90, 32, 36, 95, 45, 46,
71
+ 48, 57, 65, 90, 32, 36, 95, 45, 46, 48, 57, 65,
72
+ 90, 32, 36, 95, 45, 46, 48, 57, 65, 90, 32, 36,
73
+ 95, 45, 46, 48, 57, 65, 90, 32, 36, 95, 45, 46,
74
+ 48, 57, 65, 90, 32, 36, 95, 45, 46, 48, 57, 65,
75
+ 90, 32, 36, 95, 45, 46, 48, 57, 65, 90, 32, 36,
76
+ 95, 45, 46, 48, 57, 65, 90, 32, 36, 95, 45, 46,
77
+ 48, 57, 65, 90, 32, 36, 95, 45, 46, 48, 57, 65,
78
+ 90, 32, 36, 95, 45, 46, 48, 57, 65, 90, 32, 36,
79
+ 95, 45, 46, 48, 57, 65, 90, 32, 0
80
+ };
81
+ }
82
+
83
+ private static final char _http_parser_trans_keys[] = init__http_parser_trans_keys_0();
84
+
85
+
86
+ private static byte[] init__http_parser_single_lengths_0()
87
+ {
88
+ return new byte [] {
89
+ 0, 2, 3, 4, 2, 1, 1, 1, 1, 1, 0, 1,
90
+ 0, 1, 1, 4, 1, 4, 2, 1, 5, 5, 0, 0,
91
+ 2, 7, 0, 0, 9, 0, 0, 8, 0, 0, 7, 7,
92
+ 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
93
+ 3, 3, 3, 3, 3, 3, 3, 3, 1, 0
94
+ };
95
+ }
96
+
97
+ private static final byte _http_parser_single_lengths[] = init__http_parser_single_lengths_0();
98
+
99
+
100
+ private static byte[] init__http_parser_range_lengths_0()
101
+ {
102
+ return new byte [] {
103
+ 0, 3, 3, 3, 0, 0, 0, 0, 0, 0, 1, 1,
104
+ 1, 1, 0, 6, 0, 6, 0, 0, 2, 2, 3, 3,
105
+ 4, 1, 3, 3, 1, 3, 3, 1, 3, 3, 1, 1,
106
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
107
+ 3, 3, 3, 3, 3, 3, 3, 3, 0, 0
108
+ };
109
+ }
110
+
111
+ private static final byte _http_parser_range_lengths[] = init__http_parser_range_lengths_0();
112
+
113
+
114
+ private static short[] init__http_parser_index_offsets_0()
115
+ {
116
+ return new short [] {
117
+ 0, 0, 6, 13, 21, 24, 26, 28, 30, 32, 34, 36,
118
+ 39, 41, 44, 46, 57, 59, 70, 73, 75, 83, 91, 95,
119
+ 99, 106, 115, 119, 123, 134, 138, 142, 152, 156, 160, 169,
120
+ 178, 182, 186, 193, 200, 207, 214, 221, 228, 235, 242, 249,
121
+ 256, 263, 270, 277, 284, 291, 298, 305, 312, 314
122
+ };
123
+ }
124
+
125
+ private static final short _http_parser_index_offsets[] = init__http_parser_index_offsets_0();
126
+
127
+
128
+ private static byte[] init__http_parser_indicies_0()
129
+ {
130
+ return new byte [] {
131
+ 0, 0, 0, 0, 0, 1, 2, 3, 3, 3, 3, 3,
132
+ 1, 4, 5, 6, 7, 5, 5, 5, 1, 8, 9, 1,
133
+ 10, 1, 11, 1, 12, 1, 13, 1, 14, 1, 15, 1,
134
+ 16, 15, 1, 17, 1, 18, 17, 1, 19, 1, 20, 21,
135
+ 21, 21, 21, 21, 21, 21, 21, 21, 1, 22, 1, 23,
136
+ 24, 23, 23, 23, 23, 23, 23, 23, 23, 1, 26, 27,
137
+ 25, 29, 28, 30, 32, 1, 1, 1, 1, 1, 31, 33,
138
+ 35, 1, 1, 1, 1, 1, 34, 36, 36, 36, 1, 34,
139
+ 34, 34, 1, 37, 38, 37, 37, 37, 37, 1, 8, 1,
140
+ 9, 39, 1, 1, 1, 1, 38, 40, 40, 40, 1, 38,
141
+ 38, 38, 1, 41, 1, 43, 44, 45, 1, 1, 46, 1,
142
+ 1, 42, 47, 47, 47, 1, 42, 42, 42, 1, 8, 1,
143
+ 9, 49, 1, 1, 50, 1, 1, 48, 51, 51, 51, 1,
144
+ 48, 48, 48, 1, 52, 1, 54, 55, 1, 1, 1, 1,
145
+ 53, 56, 1, 58, 59, 1, 1, 1, 1, 57, 60, 60,
146
+ 60, 1, 57, 57, 57, 1, 2, 61, 61, 61, 61, 61,
147
+ 1, 2, 62, 62, 62, 62, 62, 1, 2, 63, 63, 63,
148
+ 63, 63, 1, 2, 64, 64, 64, 64, 64, 1, 2, 65,
149
+ 65, 65, 65, 65, 1, 2, 66, 66, 66, 66, 66, 1,
150
+ 2, 67, 67, 67, 67, 67, 1, 2, 68, 68, 68, 68,
151
+ 68, 1, 2, 69, 69, 69, 69, 69, 1, 2, 70, 70,
152
+ 70, 70, 70, 1, 2, 71, 71, 71, 71, 71, 1, 2,
153
+ 72, 72, 72, 72, 72, 1, 2, 73, 73, 73, 73, 73,
154
+ 1, 2, 74, 74, 74, 74, 74, 1, 2, 75, 75, 75,
155
+ 75, 75, 1, 2, 76, 76, 76, 76, 76, 1, 2, 77,
156
+ 77, 77, 77, 77, 1, 2, 78, 78, 78, 78, 78, 1,
157
+ 2, 1, 1, 0
158
+ };
159
+ }
160
+
161
+ private static final byte _http_parser_indicies[] = init__http_parser_indicies_0();
162
+
163
+
164
+ private static byte[] init__http_parser_trans_targs_0()
165
+ {
166
+ return new byte [] {
167
+ 2, 0, 3, 38, 4, 24, 28, 25, 5, 20, 6, 7,
168
+ 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 57, 17,
169
+ 18, 19, 14, 18, 19, 14, 5, 21, 22, 5, 21, 22,
170
+ 23, 24, 25, 26, 27, 5, 28, 20, 29, 31, 34, 30,
171
+ 31, 32, 34, 33, 5, 35, 20, 36, 5, 35, 20, 36,
172
+ 37, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49,
173
+ 50, 51, 52, 53, 54, 55, 56
174
+ };
175
+ }
176
+
177
+ private static final byte _http_parser_trans_targs[] = init__http_parser_trans_targs_0();
178
+
179
+
180
+ private static byte[] init__http_parser_trans_actions_0()
181
+ {
182
+ return new byte [] {
183
+ 1, 0, 11, 0, 1, 1, 1, 1, 13, 13, 1, 0,
184
+ 0, 0, 0, 0, 0, 0, 19, 0, 0, 28, 23, 3,
185
+ 5, 7, 31, 7, 0, 9, 25, 1, 1, 15, 0, 0,
186
+ 0, 0, 0, 0, 0, 37, 0, 37, 0, 21, 21, 0,
187
+ 0, 0, 0, 0, 40, 17, 40, 17, 34, 0, 34, 0,
188
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
189
+ 0, 0, 0, 0, 0, 0, 0
190
+ };
191
+ }
192
+
193
+ private static final byte _http_parser_trans_actions[] = init__http_parser_trans_actions_0();
194
+
195
+
196
+ static final int http_parser_start = 1;
197
+ static final int http_parser_first_final = 57;
198
+ static final int http_parser_error = 0;
199
+
200
+ static final int http_parser_en_main = 1;
201
+
202
+
203
+ // line 69 "ext/http11/http11_parser.java.rl"
204
+
205
+ public static interface ElementCB {
206
+ public void call(Object data, int at, int length);
207
+ }
208
+
209
+ public static interface FieldCB {
210
+ public void call(Object data, int field, int flen, int value, int vlen);
211
+ }
212
+
213
+ public static class HttpParser {
214
+ int cs;
215
+ int body_start;
216
+ int content_len;
217
+ int nread;
218
+ int mark;
219
+ int field_start;
220
+ int field_len;
221
+ int query_start;
222
+
223
+ Object data;
224
+ ByteList buffer;
225
+
226
+ public FieldCB http_field;
227
+ public ElementCB request_method;
228
+ public ElementCB request_uri;
229
+ public ElementCB fragment;
230
+ public ElementCB request_path;
231
+ public ElementCB query_string;
232
+ public ElementCB http_version;
233
+ public ElementCB header_done;
234
+
235
+ public void init() {
236
+ cs = 0;
237
+
238
+
239
+ // line 240 "ext/http11/org/jruby/mongrel/Http11Parser.java"
240
+ {
241
+ cs = http_parser_start;
242
+ }
243
+
244
+ // line 104 "ext/http11/http11_parser.java.rl"
245
+
246
+ body_start = 0;
247
+ content_len = 0;
248
+ mark = 0;
249
+ nread = 0;
250
+ field_len = 0;
251
+ field_start = 0;
252
+ }
253
+ }
254
+
255
+ public final HttpParser parser = new HttpParser();
256
+
257
+ public int execute(ByteList buffer, int off) {
258
+ int p, pe;
259
+ int cs = parser.cs;
260
+ int len = buffer.length();
261
+ assert off<=len : "offset past end of buffer";
262
+
263
+ p = off;
264
+ pe = len;
265
+ byte[] data = buffer.unsafeBytes();
266
+ parser.buffer = buffer;
267
+
268
+
269
+ // line 270 "ext/http11/org/jruby/mongrel/Http11Parser.java"
270
+ {
271
+ int _klen;
272
+ int _trans = 0;
273
+ int _acts;
274
+ int _nacts;
275
+ int _keys;
276
+ int _goto_targ = 0;
277
+
278
+ _goto: while (true) {
279
+ switch ( _goto_targ ) {
280
+ case 0:
281
+ if ( p == pe ) {
282
+ _goto_targ = 4;
283
+ continue _goto;
284
+ }
285
+ if ( cs == 0 ) {
286
+ _goto_targ = 5;
287
+ continue _goto;
288
+ }
289
+ case 1:
290
+ _match: do {
291
+ _keys = _http_parser_key_offsets[cs];
292
+ _trans = _http_parser_index_offsets[cs];
293
+ _klen = _http_parser_single_lengths[cs];
294
+ if ( _klen > 0 ) {
295
+ int _lower = _keys;
296
+ int _mid;
297
+ int _upper = _keys + _klen - 1;
298
+ while (true) {
299
+ if ( _upper < _lower )
300
+ break;
301
+
302
+ _mid = _lower + ((_upper-_lower) >> 1);
303
+ if ( data[p] < _http_parser_trans_keys[_mid] )
304
+ _upper = _mid - 1;
305
+ else if ( data[p] > _http_parser_trans_keys[_mid] )
306
+ _lower = _mid + 1;
307
+ else {
308
+ _trans += (_mid - _keys);
309
+ break _match;
310
+ }
311
+ }
312
+ _keys += _klen;
313
+ _trans += _klen;
314
+ }
315
+
316
+ _klen = _http_parser_range_lengths[cs];
317
+ if ( _klen > 0 ) {
318
+ int _lower = _keys;
319
+ int _mid;
320
+ int _upper = _keys + (_klen<<1) - 2;
321
+ while (true) {
322
+ if ( _upper < _lower )
323
+ break;
324
+
325
+ _mid = _lower + (((_upper-_lower) >> 1) & ~1);
326
+ if ( data[p] < _http_parser_trans_keys[_mid] )
327
+ _upper = _mid - 2;
328
+ else if ( data[p] > _http_parser_trans_keys[_mid+1] )
329
+ _lower = _mid + 2;
330
+ else {
331
+ _trans += ((_mid - _keys)>>1);
332
+ break _match;
333
+ }
334
+ }
335
+ _trans += _klen;
336
+ }
337
+ } while (false);
338
+
339
+ _trans = _http_parser_indicies[_trans];
340
+ cs = _http_parser_trans_targs[_trans];
341
+
342
+ if ( _http_parser_trans_actions[_trans] != 0 ) {
343
+ _acts = _http_parser_trans_actions[_trans];
344
+ _nacts = (int) _http_parser_actions[_acts++];
345
+ while ( _nacts-- > 0 )
346
+ {
347
+ switch ( _http_parser_actions[_acts++] )
348
+ {
349
+ case 0:
350
+ // line 13 "ext/http11/http11_parser.java.rl"
351
+ {parser.mark = p; }
352
+ break;
353
+ case 1:
354
+ // line 15 "ext/http11/http11_parser.java.rl"
355
+ { parser.field_start = p; }
356
+ break;
357
+ case 2:
358
+ // line 16 "ext/http11/http11_parser.java.rl"
359
+ { /* FIXME stub */ }
360
+ break;
361
+ case 3:
362
+ // line 17 "ext/http11/http11_parser.java.rl"
363
+ {
364
+ parser.field_len = p-parser.field_start;
365
+ }
366
+ break;
367
+ case 4:
368
+ // line 21 "ext/http11/http11_parser.java.rl"
369
+ { parser.mark = p; }
370
+ break;
371
+ case 5:
372
+ // line 22 "ext/http11/http11_parser.java.rl"
373
+ {
374
+ if(parser.http_field != null) {
375
+ parser.http_field.call(parser.data, parser.field_start, parser.field_len, parser.mark, p-parser.mark);
376
+ }
377
+ }
378
+ break;
379
+ case 6:
380
+ // line 27 "ext/http11/http11_parser.java.rl"
381
+ {
382
+ if(parser.request_method != null)
383
+ parser.request_method.call(parser.data, parser.mark, p-parser.mark);
384
+ }
385
+ break;
386
+ case 7:
387
+ // line 31 "ext/http11/http11_parser.java.rl"
388
+ {
389
+ if(parser.request_uri != null)
390
+ parser.request_uri.call(parser.data, parser.mark, p-parser.mark);
391
+ }
392
+ break;
393
+ case 8:
394
+ // line 35 "ext/http11/http11_parser.java.rl"
395
+ {
396
+ if(parser.fragment != null)
397
+ parser.fragment.call(parser.data, parser.mark, p-parser.mark);
398
+ }
399
+ break;
400
+ case 9:
401
+ // line 40 "ext/http11/http11_parser.java.rl"
402
+ {parser.query_start = p; }
403
+ break;
404
+ case 10:
405
+ // line 41 "ext/http11/http11_parser.java.rl"
406
+ {
407
+ if(parser.query_string != null)
408
+ parser.query_string.call(parser.data, parser.query_start, p-parser.query_start);
409
+ }
410
+ break;
411
+ case 11:
412
+ // line 46 "ext/http11/http11_parser.java.rl"
413
+ {
414
+ if(parser.http_version != null)
415
+ parser.http_version.call(parser.data, parser.mark, p-parser.mark);
416
+ }
417
+ break;
418
+ case 12:
419
+ // line 51 "ext/http11/http11_parser.java.rl"
420
+ {
421
+ if(parser.request_path != null)
422
+ parser.request_path.call(parser.data, parser.mark, p-parser.mark);
423
+ }
424
+ break;
425
+ case 13:
426
+ // line 56 "ext/http11/http11_parser.java.rl"
427
+ {
428
+ parser.body_start = p + 1;
429
+ if(parser.header_done != null)
430
+ parser.header_done.call(parser.data, p + 1, pe - p - 1);
431
+ { p += 1; _goto_targ = 5; if (true) continue _goto;}
432
+ }
433
+ break;
434
+ // line 435 "ext/http11/org/jruby/mongrel/Http11Parser.java"
435
+ }
436
+ }
437
+ }
438
+
439
+ case 2:
440
+ if ( cs == 0 ) {
441
+ _goto_targ = 5;
442
+ continue _goto;
443
+ }
444
+ if ( ++p != pe ) {
445
+ _goto_targ = 1;
446
+ continue _goto;
447
+ }
448
+ case 4:
449
+ case 5:
450
+ }
451
+ break; }
452
+ }
453
+
454
+ // line 128 "ext/http11/http11_parser.java.rl"
455
+
456
+ parser.cs = cs;
457
+ parser.nread += (p - off);
458
+
459
+ assert p <= pe : "buffer overflow after parsing execute";
460
+ assert parser.nread <= len : "nread longer than length";
461
+ assert parser.body_start <= len : "body starts after buffer end";
462
+ assert parser.mark < len : "mark is after buffer end";
463
+ assert parser.field_len <= len : "field has length longer than whole buffer";
464
+ assert parser.field_start < len : "field starts after buffer end";
465
+
466
+ return parser.nread;
467
+ }
468
+
469
+ public int finish() {
470
+ if(has_error()) {
471
+ return -1;
472
+ } else if(is_finished()) {
473
+ return 1;
474
+ } else {
475
+ return 0;
476
+ }
477
+ }
478
+
479
+ public boolean has_error() {
480
+ return parser.cs == http_parser_error;
481
+ }
482
+
483
+ public boolean is_finished() {
484
+ return parser.cs == http_parser_first_final;
485
+ }
486
+ }