http11_parser.c
来自「Amarok是一款在LINUX或其他类UNIX操作系统中运行的音频播放器软件。 」· C语言 代码 · 共 1,097 行 · 第 1/2 页
C
1,097 行
#line 1 "ext/http11/http11_parser.rl"/** * Copyright (c) 2005 Zed A. Shaw * You can redistribute it and/or modify it under the same terms as Ruby. */#include "http11_parser.h"#include <stdio.h>#include <assert.h>#include <stdlib.h>#include <ctype.h>#include <string.h>#define LEN(AT, FPC) (FPC - buffer - parser->AT)#define MARK(M,FPC) (parser->M = (FPC) - buffer)#define PTR_TO(F) (buffer + parser->F)/** machine **/#line 114 "ext/http11/http11_parser.rl"/** Data **/#line 24 "ext/http11/http11_parser.c"static const int http_parser_start = 0;static const int http_parser_first_final = 53;static const int http_parser_error = 1;#line 118 "ext/http11/http11_parser.rl"int http_parser_init(http_parser *parser) { int cs = 0; #line 36 "ext/http11/http11_parser.c" { cs = http_parser_start; }#line 122 "ext/http11/http11_parser.rl" parser->cs = cs; parser->body_start = 0; parser->content_len = 0; parser->mark = 0; parser->nread = 0; parser->field_len = 0; parser->field_start = 0; return(1);}/** exec **/size_t http_parser_execute(http_parser *parser, const char *buffer, size_t len, size_t off) { const char *p, *pe; int cs = parser->cs; assert(off <= len && "offset past end of buffer"); p = buffer+off; pe = buffer+len; assert(*pe == '\0' && "pointer does not end on NUL"); assert(pe - p == len - off && "pointers aren't same distance"); #line 68 "ext/http11/http11_parser.c" { if ( p == pe ) goto _out; switch ( cs ) {case 0: switch( (*p) ) { case 36: goto tr14; case 95: goto tr14; } if ( (*p) < 48 ) { if ( 45 <= (*p) && (*p) <= 46 ) goto tr14; } else if ( (*p) > 57 ) { if ( 65 <= (*p) && (*p) <= 90 ) goto tr14; } else goto tr14; goto st1;st1: goto _out1;tr14:#line 20 "ext/http11/http11_parser.rl" {MARK(mark, p); } goto st2;st2: if ( ++p == pe ) goto _out2;case 2:#line 98 "ext/http11/http11_parser.c" switch( (*p) ) { case 32: goto tr17; case 36: goto st34; case 95: goto st34; } if ( (*p) < 48 ) { if ( 45 <= (*p) && (*p) <= 46 ) goto st34; } else if ( (*p) > 57 ) { if ( 65 <= (*p) && (*p) <= 90 ) goto st34; } else goto st34; goto st1;tr17:#line 34 "ext/http11/http11_parser.rl" { if(parser->request_method != NULL) parser->request_method(parser->data, PTR_TO(mark), LEN(mark, p)); } goto st3;st3: if ( ++p == pe ) goto _out3;case 3:#line 124 "ext/http11/http11_parser.c" switch( (*p) ) { case 42: goto tr10; case 43: goto tr11; case 47: goto tr12; case 58: goto tr13; } if ( (*p) < 65 ) { if ( 45 <= (*p) && (*p) <= 57 ) goto tr11; } else if ( (*p) > 90 ) { if ( 97 <= (*p) && (*p) <= 122 ) goto tr11; } else goto tr11; goto st1;tr10:#line 20 "ext/http11/http11_parser.rl" {MARK(mark, p); } goto st4;st4: if ( ++p == pe ) goto _out4;case 4:#line 148 "ext/http11/http11_parser.c" if ( (*p) == 32 ) goto tr19; goto st1;tr19:#line 38 "ext/http11/http11_parser.rl" { if(parser->request_uri != NULL) parser->request_uri(parser->data, PTR_TO(mark), LEN(mark, p)); } goto st5;tr28:#line 44 "ext/http11/http11_parser.rl" { if(parser->query_string != NULL) parser->query_string(parser->data, PTR_TO(query_start), LEN(query_start, p)); }#line 38 "ext/http11/http11_parser.rl" { if(parser->request_uri != NULL) parser->request_uri(parser->data, PTR_TO(mark), LEN(mark, p)); } goto st5;tr31:#line 54 "ext/http11/http11_parser.rl" { if(parser->request_path != NULL) parser->request_path(parser->data, PTR_TO(mark), LEN(mark,p)); }#line 38 "ext/http11/http11_parser.rl" { if(parser->request_uri != NULL) parser->request_uri(parser->data, PTR_TO(mark), LEN(mark, p)); } goto st5;tr40:#line 43 "ext/http11/http11_parser.rl" {MARK(query_start, p); }#line 44 "ext/http11/http11_parser.rl" { if(parser->query_string != NULL) parser->query_string(parser->data, PTR_TO(query_start), LEN(query_start, p)); }#line 38 "ext/http11/http11_parser.rl" { if(parser->request_uri != NULL) parser->request_uri(parser->data, PTR_TO(mark), LEN(mark, p)); } goto st5;st5: if ( ++p == pe ) goto _out5;case 5:#line 201 "ext/http11/http11_parser.c" if ( (*p) == 72 ) goto tr3; goto st1;tr3:#line 20 "ext/http11/http11_parser.rl" {MARK(mark, p); } goto st6;st6: if ( ++p == pe ) goto _out6;case 6:#line 213 "ext/http11/http11_parser.c" if ( (*p) == 84 ) goto st7; goto st1;st7: if ( ++p == pe ) goto _out7;case 7: if ( (*p) == 84 ) goto st8; goto st1;st8: if ( ++p == pe ) goto _out8;case 8: if ( (*p) == 80 ) goto st9; goto st1;st9: if ( ++p == pe ) goto _out9;case 9: if ( (*p) == 47 ) goto st10; goto st1;st10: if ( ++p == pe ) goto _out10;case 10: if ( 48 <= (*p) && (*p) <= 57 ) goto st11; goto st1;st11: if ( ++p == pe ) goto _out11;case 11: if ( (*p) == 46 ) goto st12; if ( 48 <= (*p) && (*p) <= 57 ) goto st11; goto st1;st12: if ( ++p == pe ) goto _out12;case 12: if ( 48 <= (*p) && (*p) <= 57 ) goto st13; goto st1;st13: if ( ++p == pe ) goto _out13;case 13: if ( (*p) == 13 ) goto tr22; if ( 48 <= (*p) && (*p) <= 57 ) goto st13; goto st1;tr22:#line 49 "ext/http11/http11_parser.rl" { if(parser->http_version != NULL) parser->http_version(parser->data, PTR_TO(mark), LEN(mark, p)); } goto st14;tr36:#line 29 "ext/http11/http11_parser.rl" { if(parser->http_field != NULL) { parser->http_field(parser->data, PTR_TO(field_start), parser->field_len, PTR_TO(mark), LEN(mark, p)); } } goto st14;st14: if ( ++p == pe ) goto _out14;case 14:#line 289 "ext/http11/http11_parser.c" if ( (*p) == 10 ) goto st15; goto st1;st15: if ( ++p == pe ) goto _out15;case 15: switch( (*p) ) { case 13: goto st16; case 33: goto tr21; case 124: goto tr21; case 126: goto tr21; } if ( (*p) < 45 ) { if ( (*p) > 39 ) { if ( 42 <= (*p) && (*p) <= 43 ) goto tr21; } else if ( (*p) >= 35 ) goto tr21; } else if ( (*p) > 46 ) { if ( (*p) < 65 ) { if ( 48 <= (*p) && (*p) <= 57 ) goto tr21; } else if ( (*p) > 90 ) { if ( 94 <= (*p) && (*p) <= 122 ) goto tr21; } else goto tr21; } else goto tr21; goto st1;st16: if ( ++p == pe ) goto _out16;case 16: if ( (*p) == 10 ) goto tr25; goto st1;tr25:#line 59 "ext/http11/http11_parser.rl" { parser->body_start = p - buffer + 1; if(parser->header_done != NULL) parser->header_done(parser->data, p + 1, pe - p - 1); goto _out53; } goto st53;st53: if ( ++p == pe ) goto _out53;case 53:#line 341 "ext/http11/http11_parser.c" goto st1;tr21:#line 23 "ext/http11/http11_parser.rl" { MARK(field_start, p); } goto st17;st17: if ( ++p == pe ) goto _out17;case 17:#line 351 "ext/http11/http11_parser.c" switch( (*p) ) { case 33: goto st17; case 58: goto tr16; case 124: goto st17; case 126: goto st17; } if ( (*p) < 45 ) { if ( (*p) > 39 ) { if ( 42 <= (*p) && (*p) <= 43 ) goto st17; } else if ( (*p) >= 35 ) goto st17; } else if ( (*p) > 46 ) { if ( (*p) < 65 ) { if ( 48 <= (*p) && (*p) <= 57 ) goto st17; } else if ( (*p) > 90 ) { if ( 94 <= (*p) && (*p) <= 122 ) goto st17; } else goto st17; } else goto st17; goto st1;tr16:#line 24 "ext/http11/http11_parser.rl" { parser->field_len = LEN(field_start, p); } goto st18;tr38:#line 28 "ext/http11/http11_parser.rl" { MARK(mark, p); } goto st18;st18: if ( ++p == pe ) goto _out18;case 18:#line 390 "ext/http11/http11_parser.c" switch( (*p) ) { case 13: goto tr36; case 32: goto tr38; } goto tr37;tr37:#line 28 "ext/http11/http11_parser.rl" { MARK(mark, p); } goto st19;st19: if ( ++p == pe ) goto _out19;case 19:#line 404 "ext/http11/http11_parser.c" if ( (*p) == 13 ) goto tr36; goto st19;tr11:#line 20 "ext/http11/http11_parser.rl" {MARK(mark, p); } goto st20;st20: if ( ++p == pe ) goto _out20;case 20:#line 416 "ext/http11/http11_parser.c" switch( (*p) ) { case 43: goto st20; case 58: goto st21; } if ( (*p) < 48 ) { if ( 45 <= (*p) && (*p) <= 46 ) goto st20; } else if ( (*p) > 57 ) { if ( (*p) > 90 ) { if ( 97 <= (*p) && (*p) <= 122 ) goto st20; } else if ( (*p) >= 65 ) goto st20; } else goto st20; goto st1;tr13:#line 20 "ext/http11/http11_parser.rl" {MARK(mark, p); } goto st21;st21: if ( ++p == pe ) goto _out21;case 21:#line 441 "ext/http11/http11_parser.c" switch( (*p) ) { case 32: goto tr19; case 37: goto st22; case 60: goto st1; case 62: goto st1; case 127: goto st1; } if ( (*p) > 31 ) { if ( 34 <= (*p) && (*p) <= 35 ) goto st1; } else if ( (*p) >= 0 ) goto st1; goto st21;st22: if ( ++p == pe ) goto _out22;case 22: if ( (*p) < 65 ) { if ( 48 <= (*p) && (*p) <= 57 ) goto st23; } else if ( (*p) > 70 ) { if ( 97 <= (*p) && (*p) <= 102 ) goto st23; } else goto st23; goto st1;st23: if ( ++p == pe ) goto _out23;case 23: if ( (*p) < 65 ) { if ( 48 <= (*p) && (*p) <= 57 ) goto st21; } else if ( (*p) > 70 ) { if ( 97 <= (*p) && (*p) <= 102 ) goto st21; } else goto st21; goto st1;tr12:#line 20 "ext/http11/http11_parser.rl" {MARK(mark, p); } goto st24;st24: if ( ++p == pe ) goto _out24;case 24:#line 489 "ext/http11/http11_parser.c" switch( (*p) ) { case 32: goto tr31; case 37: goto st25; case 59: goto tr33; case 60: goto st1; case 62: goto st1; case 63: goto tr34; case 127: goto st1; } if ( (*p) > 31 ) { if ( 34 <= (*p) && (*p) <= 35 ) goto st1; } else if ( (*p) >= 0 ) goto st1; goto st24;st25: if ( ++p == pe ) goto _out25;case 25: if ( (*p) < 65 ) { if ( 48 <= (*p) && (*p) <= 57 ) goto st26; } else if ( (*p) > 70 ) { if ( 97 <= (*p) && (*p) <= 102 ) goto st26; } else goto st26; goto st1;st26: if ( ++p == pe ) goto _out26;case 26: if ( (*p) < 65 ) { if ( 48 <= (*p) && (*p) <= 57 ) goto st24; } else if ( (*p) > 70 ) { if ( 97 <= (*p) && (*p) <= 102 ) goto st24; } else goto st24; goto st1;tr33:#line 54 "ext/http11/http11_parser.rl" { if(parser->request_path != NULL) parser->request_path(parser->data, PTR_TO(mark), LEN(mark,p)); } goto st27;st27: if ( ++p == pe ) goto _out27;case 27:#line 542 "ext/http11/http11_parser.c" switch( (*p) ) { case 32: goto tr19; case 37: goto st28; case 60: goto st1; case 62: goto st1; case 63: goto st30; case 127: goto st1; }
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?