src/server/daemon/httpparser.c

changeset 101
7fbcdbad0baa
parent 44
3da1f7b6847f
child 162
b169992137a8
equal deleted inserted replaced
100:e9bb8449df02 101:7fbcdbad0baa
39 parser->request = request; 39 parser->request = request;
40 40
41 parser->state = 0; 41 parser->state = 0;
42 parser->start_line.ptr = (char*)request->netbuf->inbuf; 42 parser->start_line.ptr = (char*)request->netbuf->inbuf;
43 parser->start_line.length = 0; 43 parser->start_line.length = 0;
44
45 parser->offset = 0;
44 46
45 return parser; 47 return parser;
46 } 48 }
47 49
48 void http_parser_free(HttpParser *parser) { 50 void http_parser_free(HttpParser *parser) {
73 int get_start_line(HttpParser *parser) { 75 int get_start_line(HttpParser *parser) {
74 netbuf *buf = parser->request->netbuf; 76 netbuf *buf = parser->request->netbuf;
75 while(buf->pos < buf->cursize) { 77 while(buf->pos < buf->cursize) {
76 unsigned char c = buf->inbuf[buf->pos]; 78 unsigned char c = buf->inbuf[buf->pos];
77 if(c == '\n') { 79 if(c == '\n') {
78 if(buf->pos <= 1) { 80 size_t lnlen = buf->pos - parser->offset + 1;
81 if(lnlen <= 2) {
82 if(lnlen == 1 || buf->inbuf[buf->pos-1] == '\r') {
83 // skip empty line
84 buf->pos++;
85 parser->offset = buf->pos;
86 return 1;
87 }
79 // insufficient chars for request, return error 88 // insufficient chars for request, return error
80 return 2; 89 return 2;
81 } 90 }
82 if(buf->inbuf[buf->pos - 1] == '\r') { 91 if(buf->inbuf[buf->pos - 1] == '\r') {
83 parser->start_line.length = buf->pos; 92 parser->start_line.length = lnlen - 1;
84 } else { 93 } else {
85 parser->start_line.length = buf->pos + 1; 94 parser->start_line.length = lnlen;
86 } 95 }
87 parser->start_line.ptr = (char*)buf->inbuf; 96 parser->start_line.ptr = (char*)buf->inbuf + parser->offset;
88 buf->pos++; 97 buf->pos++;
89 return 0; 98 return 0;
90 } 99 }
91 buf->pos++; 100 buf->pos++;
92 } 101 }
96 int http_parser_parse_header(HttpParser *parser) { 105 int http_parser_parse_header(HttpParser *parser) {
97 netbuf *buf = parser->request->netbuf; 106 netbuf *buf = parser->request->netbuf;
98 107
99 parser->offset = buf->pos; // line offset 108 parser->offset = buf->pos; // line offset
100 parser->name.ptr = NULL; 109 parser->name.ptr = NULL;
110 parser->name.length = 0;
101 parser->value.ptr = NULL; 111 parser->value.ptr = NULL;
112 parser->value.length = 0;
102 while(1) { 113 while(1) {
103 if(buf->pos >= buf->cursize) { 114 if(buf->pos >= buf->cursize) {
104 return 1; 115 return 1;
105 } 116 }
106 char c = (char)buf->inbuf[buf->pos++]; 117 char c = (char)buf->inbuf[buf->pos++];
107 118
108 if(c > 32) { 119 if(c > 32) {
109 parser->wl = 0; 120 parser->wl = 0;
110 if(c == ':' && parser->value.ptr == NULL) { 121 if(c == ':' && parser->value.ptr == NULL) {
111 parser->name.ptr = (char*)buf->inbuf + parser->offset; 122 parser->name.ptr = (char*)buf->inbuf + parser->offset;
112 buf->inbuf[buf->pos-1] = 0; 123 parser->name.length = buf->pos - parser->offset - 1;
113 } else if(parser->name.ptr != NULL && parser->value.ptr == NULL) { 124 } else if(parser->name.ptr != NULL && parser->value.ptr == NULL) {
114 parser->value.ptr = (char*)buf->inbuf + buf->pos - 1; 125 parser->value.ptr = (char*)buf->inbuf + buf->pos - 1;
115 } 126 }
116 } else if(c == '\n') { 127 } else if(c == '\n') {
117 if(parser->wl) { 128 if(parser->wl) {
119 parser->state++; 130 parser->state++;
120 return 0; 131 return 0;
121 } else { 132 } else {
122 parser->offset = buf->pos; 133 parser->offset = buf->pos;
123 if(parser->value.ptr != NULL) { 134 if(parser->value.ptr != NULL) {
124 buf->inbuf[buf->pos-1] = 0; 135 parser->value.length = (buf->inbuf + buf->pos - 1)
136 - (unsigned char*)parser->value.ptr;
125 if(buf->inbuf[buf->pos-2] == '\r') { 137 if(buf->inbuf[buf->pos-2] == '\r') {
126 buf->inbuf[buf->pos-2] = 0; 138 parser->value.length--;
127 } 139 }
128 // add header 140 // add header
129 header_add( 141 header_add(
130 parser->request->headers, 142 parser->request->headers,
131 parser->name.ptr, 143 parser->name,
132 parser->value.ptr); 144 parser->value);
133 } else { 145 } else {
134 // error: no value 146 // error: no value
135 return 2; 147 return 2;
136 } 148 }
137 parser->name.ptr = NULL; 149 parser->name.ptr = NULL;
138 parser->value.ptr = NULL; 150 parser->value.ptr = NULL;
151 parser->name.length = 0;
152 parser->value.length = 0;
139 parser->wl = 1; 153 parser->wl = 1;
140 } 154 }
141 } 155 }
142 } 156 }
143 } 157 }

mercurial