Commit dfdfd20d8ef631dada26ad835e25d289cb5425e7
1 parent
eae798e5
now incomplete requests should no longer block the complete server. Tested with …
…\'echo -en "GET / HTTP\r\nConn" | nc -w 600 localhost 11212\' and then doing requests from my browser. @TODO: cleanup those stuff, check if a not correctly response reading would block the server.
Showing
4 changed files
with
58 additions
and
3 deletions
| 1 | +2012-02-19 20:12:40 +0100 Georg Hopp | |
| 2 | + | |
| 3 | + * now incomplete requests should no longer block the complete server. Tested with \'echo -en "GET / HTTP\r\nConn" | nc -w 600 localhost 11212\' and then doing requests from my browser. @TODO: cleanup those stuff, check if a not correctly response reading would block the server. (HEAD, master) | |
| 4 | + | |
| 1 | 5 | 2012-02-19 18:28:30 +0100 Georg Hopp |
| 2 | 6 | |
| 3 | - * increase writebuffer size a lot. (HEAD, master) | |
| 7 | + * increase writebuffer size a lot. (origin/master, origin/HEAD) | |
| 4 | 8 | |
| 5 | 9 | 2012-02-19 18:15:55 +0100 Georg Hopp |
| 6 | 10 | |
| 7 | - * fixed the non keep-alive performance issue as well as i lower memory usage by using a single read and write circular buffer for every connection. @TODO: i noticed a server hang while getting large data (my image) with non keep-alive connections. Additionally an incomplete keep-alive request might stop the server now as the lock on the read buffer will not be released. (origin/master, origin/HEAD) | |
| 11 | + * fixed the non keep-alive performance issue as well as i lower memory usage by using a single read and write circular buffer for every connection. @TODO: i noticed a server hang while getting large data (my image) with non keep-alive connections. Additionally an incomplete keep-alive request might stop the server now as the lock on the read buffer will not be released. | |
| 8 | 12 | |
| 9 | 13 | 2012-02-19 15:41:48 +0100 Georg Hopp |
| 10 | 14 | ... | ... |
| ... | ... | @@ -25,7 +25,30 @@ httpRequestParserParse(HttpRequestParser this, int fd) |
| 25 | 25 | this->ourLock = TRUE; |
| 26 | 26 | } |
| 27 | 27 | |
| 28 | - if(0 > (read = cbufRead(this->buffer, fd))) { | |
| 28 | + if (NULL != this->incomplete) { | |
| 29 | + /** | |
| 30 | + * i need a way to stop incomplete requests | |
| 31 | + * from locking the buffer forever. | |
| 32 | + * Maybe this is the position for this... | |
| 33 | + * but i must carefully think about the | |
| 34 | + * conditions...maybe a rewrite of the | |
| 35 | + * parser is neccessary to detect a | |
| 36 | + * stale request. | |
| 37 | + * The problem here seems to be that i can't | |
| 38 | + * say for sure if the request is stale. | |
| 39 | + * This is mostly because i work linewise. | |
| 40 | + * This MUST be accomplished within | |
| 41 | + * request line and header reads. | |
| 42 | + * As far as i see the only way it to | |
| 43 | + * always empty the buffer completely after | |
| 44 | + * every read and release the buffer then. | |
| 45 | + */ | |
| 46 | + cbufSetData(this->buffer, this->incomplete, this->isize); | |
| 47 | + free(this->incomplete); | |
| 48 | + this->incomplete = NULL; | |
| 49 | + } | |
| 50 | + | |
| 51 | + if (0 > (read = cbufRead(this->buffer, fd))) { | |
| 29 | 52 | return read; |
| 30 | 53 | } |
| 31 | 54 | |
| ... | ... | @@ -47,6 +70,15 @@ httpRequestParserParse(HttpRequestParser this, int fd) |
| 47 | 70 | |
| 48 | 71 | case HTTP_REQUEST_START: |
| 49 | 72 | if (NULL == (line = cbufGetLine(this->buffer))) { |
| 73 | + if (! cbufIsEmpty(this->buffer)) { | |
| 74 | + this->isize = this->buffer->bused; | |
| 75 | + this->incomplete = malloc(this->isize); | |
| 76 | + memcpy(this->incomplete, | |
| 77 | + cbufGetData(this->buffer, this->isize), | |
| 78 | + this->isize); | |
| 79 | + } | |
| 80 | + cbufRelease(this->buffer); | |
| 81 | + this->ourLock = FALSE; | |
| 50 | 82 | cont = 0; |
| 51 | 83 | break; |
| 52 | 84 | } |
| ... | ... | @@ -69,6 +101,15 @@ httpRequestParserParse(HttpRequestParser this, int fd) |
| 69 | 101 | |
| 70 | 102 | case HTTP_REQUEST_REQUEST_LINE_DONE: |
| 71 | 103 | if (NULL == (line = cbufGetLine(this->buffer))) { |
| 104 | + if (! cbufIsEmpty(this->buffer)) { | |
| 105 | + this->isize = this->buffer->bused; | |
| 106 | + this->incomplete = malloc(this->isize); | |
| 107 | + memcpy(this->incomplete, | |
| 108 | + cbufGetData(this->buffer, this->isize), | |
| 109 | + this->isize); | |
| 110 | + } | |
| 111 | + cbufRelease(this->buffer); | |
| 112 | + this->ourLock = FALSE; | |
| 72 | 113 | cont = 0; |
| 73 | 114 | break; |
| 74 | 115 | } |
| ... | ... | @@ -100,6 +141,10 @@ httpRequestParserParse(HttpRequestParser this, int fd) |
| 100 | 141 | HttpMessage message = (HttpMessage)this->cur_request; |
| 101 | 142 | |
| 102 | 143 | httpRequestParserGetBody(this); |
| 144 | + if (cbufIsEmpty(this->buffer)) { | |
| 145 | + cbufRelease(this->buffer); | |
| 146 | + this->ourLock = FALSE; | |
| 147 | + } | |
| 103 | 148 | |
| 104 | 149 | if (message->dbody == message->nbody) { |
| 105 | 150 | this->state = HTTP_REQUEST_DONE; | ... | ... |
Please
register
or
login
to post a comment