0
watch(connection, thin_connection_readable_cb, read, EV_READ);
0
+ /* TODO add timeout watcher */
0
void thin_connection_parse(thin_connection_t *connection, char *buf, int len)
0
- if (http_parser_is_finished(&connection->parser)) {
0
- /* parsing done, can only be some more body ... */
0
+ if (!http_parser_is_finished(&connection->parser)
0
+ && connection->read_buffer.len + len > THIN_MAX_HEADER) {
0
+ thin_connection_error(connection, "Header too big");
0
+ /* alloc more mem when buffer full */
0
+ /* TODO extract this into buffer.c and optimize */
0
+ /* TODO store big body in tempfile */
0
+ if (connection->read_buffer.len >= connection->read_buffer.salloc) {
0
- /* alloc more mem when buffer full */
0
- /* TODO extract this into buffer.c and optimize */
0
- /* TODO store big body in tempfile */
0
- if (connection->read_buffer.len >= connection->read_buffer.salloc) {
0
+ /* TODO if last alloc, just alloc next block */
0
+ old = connection->read_buffer.ptr;
0
+ new = (char *) palloc(connection->buffer_pool,
0
+ connection->read_buffer.nalloc + 1);
0
+ rb_sys_fail("palloc");
0
- old = connection->read_buffer.ptr;
0
- new = (char *) palloc(connection->buffer_pool,
0
- connection->read_buffer.nalloc * 2);
0
- rb_sys_fail("palloc");
0
- memcpy(new, old, connection->read_buffer.len);
0
+ memcpy(new, old, connection->read_buffer.len);
0
- connection->read_buffer.ptr = new;
0
- connection->read_buffer.nalloc *= 2;
0
- connection->read_buffer.salloc *= 2;
0
- pfree(connection->buffer_pool, old);
0
- memcpy(connection->read_buffer.ptr + connection->read_buffer.len, buf, len);
0
+ connection->read_buffer.ptr = new;
0
+ connection->read_buffer.nalloc ++;
0
+ connection->read_buffer.salloc += connection->buffer_pool->size;
0
+ pfree(connection->buffer_pool, old);
0
+ memcpy(connection->read_buffer.ptr + connection->read_buffer.len, buf, len);
0
+ connection->read_buffer.len += len;
0
+ if (!http_parser_is_finished(&connection->parser)) {
0
/* header not all received, we continue parsing ... */
0
- if (connection->parser.nread + len > THIN_MAX_HEADER) {
0
- thin_connection_error(connection, "Header too big");
0
/* terminate string with null (required by ragel v5) */
0
+
memset(connection->read_buffer.ptr + connection->read_buffer.len, '\0', 1);
0
/* parse the request into connection->env */
0
- http_parser_execute(&connection->parser, buf, len, connection->parser.nread);
0
+ connection->parser.nread = http_parser_execute(&connection->parser,
0
+ connection->read_buffer.ptr,
0
+ connection->read_buffer.len,
0
+ connection->parser.nread);
0
if (http_parser_has_error(&connection->parser)) {
Comments
No one has commented yet.