in ext/puma_http11/org/jruby/puma/Http11Parser.java [233:436]
public int execute(Ruby runtime, Http11 http, ByteList buffer, int off) {
int p, pe;
int cs = parser.cs;
int len = buffer.length();
assert off<=len : "offset past end of buffer";
p = off;
pe = len;
// get a copy of the bytes, since it may not start at 0
// FIXME: figure out how to just use the bytes in-place
byte[] data = buffer.bytes();
parser.buffer = buffer;
// line 250 "ext/puma_http11/org/jruby/puma/Http11Parser.java"
{
int _klen;
int _trans = 0;
int _acts;
int _nacts;
int _keys;
int _goto_targ = 0;
_goto: while (true) {
switch ( _goto_targ ) {
case 0:
if ( p == pe ) {
_goto_targ = 4;
continue _goto;
}
if ( cs == 0 ) {
_goto_targ = 5;
continue _goto;
}
case 1:
_match: do {
_keys = _puma_parser_key_offsets[cs];
_trans = _puma_parser_index_offsets[cs];
_klen = _puma_parser_single_lengths[cs];
if ( _klen > 0 ) {
int _lower = _keys;
int _mid;
int _upper = _keys + _klen - 1;
while (true) {
if ( _upper < _lower )
break;
_mid = _lower + ((_upper-_lower) >> 1);
if ( data[p] < _puma_parser_trans_keys[_mid] )
_upper = _mid - 1;
else if ( data[p] > _puma_parser_trans_keys[_mid] )
_lower = _mid + 1;
else {
_trans += (_mid - _keys);
break _match;
}
}
_keys += _klen;
_trans += _klen;
}
_klen = _puma_parser_range_lengths[cs];
if ( _klen > 0 ) {
int _lower = _keys;
int _mid;
int _upper = _keys + (_klen<<1) - 2;
while (true) {
if ( _upper < _lower )
break;
_mid = _lower + (((_upper-_lower) >> 1) & ~1);
if ( data[p] < _puma_parser_trans_keys[_mid] )
_upper = _mid - 2;
else if ( data[p] > _puma_parser_trans_keys[_mid+1] )
_lower = _mid + 2;
else {
_trans += ((_mid - _keys)>>1);
break _match;
}
}
_trans += _klen;
}
} while (false);
_trans = _puma_parser_indicies[_trans];
cs = _puma_parser_trans_targs[_trans];
if ( _puma_parser_trans_actions[_trans] != 0 ) {
_acts = _puma_parser_trans_actions[_trans];
_nacts = (int) _puma_parser_actions[_acts++];
while ( _nacts-- > 0 )
{
switch ( _puma_parser_actions[_acts++] )
{
case 0:
// line 15 "ext/puma_http11/http11_parser.java.rl"
{parser.mark = p; }
break;
case 1:
// line 17 "ext/puma_http11/http11_parser.java.rl"
{ parser.field_start = p; }
break;
case 2:
// line 18 "ext/puma_http11/http11_parser.java.rl"
{ /* FIXME stub */ }
break;
case 3:
// line 19 "ext/puma_http11/http11_parser.java.rl"
{
parser.field_len = p-parser.field_start;
}
break;
case 4:
// line 23 "ext/puma_http11/http11_parser.java.rl"
{ parser.mark = p; }
break;
case 5:
// line 24 "ext/puma_http11/http11_parser.java.rl"
{
Http11.http_field(runtime, parser.data, parser.buffer, parser.field_start, parser.field_len, parser.mark, p-parser.mark);
}
break;
case 6:
// line 27 "ext/puma_http11/http11_parser.java.rl"
{
Http11.request_method(runtime, parser.data, parser.buffer, parser.mark, p-parser.mark);
}
break;
case 7:
// line 30 "ext/puma_http11/http11_parser.java.rl"
{
Http11.request_uri(runtime, parser.data, parser.buffer, parser.mark, p-parser.mark);
}
break;
case 8:
// line 33 "ext/puma_http11/http11_parser.java.rl"
{
Http11.fragment(runtime, parser.data, parser.buffer, parser.mark, p-parser.mark);
}
break;
case 9:
// line 37 "ext/puma_http11/http11_parser.java.rl"
{parser.query_start = p; }
break;
case 10:
// line 38 "ext/puma_http11/http11_parser.java.rl"
{
Http11.query_string(runtime, parser.data, parser.buffer, parser.query_start, p-parser.query_start);
}
break;
case 11:
// line 42 "ext/puma_http11/http11_parser.java.rl"
{
Http11.http_version(runtime, parser.data, parser.buffer, parser.mark, p-parser.mark);
}
break;
case 12:
// line 46 "ext/puma_http11/http11_parser.java.rl"
{
Http11.request_path(runtime, parser.data, parser.buffer, parser.mark, p-parser.mark);
}
break;
case 13:
// line 50 "ext/puma_http11/http11_parser.java.rl"
{
parser.body_start = p + 1;
http.header_done(runtime, parser.data, parser.buffer, p + 1, pe - p - 1);
{ p += 1; _goto_targ = 5; if (true) continue _goto;}
}
break;
// line 406 "ext/puma_http11/org/jruby/puma/Http11Parser.java"
}
}
}
case 2:
if ( cs == 0 ) {
_goto_targ = 5;
continue _goto;
}
if ( ++p != pe ) {
_goto_targ = 1;
continue _goto;
}
case 4:
case 5:
}
break; }
}
// line 116 "ext/puma_http11/http11_parser.java.rl"
parser.cs = cs;
parser.nread += (p - off);
assert p <= pe : "buffer overflow after parsing execute";
assert parser.nread <= len : "nread longer than length";
assert parser.body_start <= len : "body starts after buffer end";
assert parser.mark < len : "mark is after buffer end";
assert parser.field_len <= len : "field has length longer than whole buffer";
assert parser.field_start < len : "field starts after buffer end";
return parser.nread;
}