Commit 81d98966a4301ea284acef97297613cd6bbae8bc
1 parent
f1bf7c49
porformance improvement in parsing process (no longer do alloc and free on each line)
Showing
1 changed file
with
22 additions
and
38 deletions
| @@ -101,49 +101,28 @@ CREATE_CLASS(HttpRequestParser, NULL, IFACE(Class), IFACE(StreamReader)); | @@ -101,49 +101,28 @@ CREATE_CLASS(HttpRequestParser, NULL, IFACE(Class), IFACE(StreamReader)); | ||
| 101 | 101 | ||
| 102 | static | 102 | static |
| 103 | inline | 103 | inline |
| 104 | -int | ||
| 105 | -httpRequestLineGet(HttpRequestParser this, char ** line) | 104 | +char * |
| 105 | +httpRequestLineGet(char ** data) | ||
| 106 | { | 106 | { |
| 107 | - char * line_end = strstr(this->buffer, "\r\n"); | 107 | + char * line_end = strstr(*data, "\r\n"); |
| 108 | + char * ret = *data; | ||
| 108 | 109 | ||
| 109 | if (NULL == line_end) { | 110 | if (NULL == line_end) { |
| 110 | - *line = NULL; | ||
| 111 | - return -1; | 111 | + return NULL; |
| 112 | } | 112 | } |
| 113 | 113 | ||
| 114 | *line_end = 0; | 114 | *line_end = 0; |
| 115 | - *line = malloc(strlen(this->buffer) + 1); | ||
| 116 | - strcpy(*line, this->buffer); | 115 | + *data = line_end + 2; |
| 117 | 116 | ||
| 118 | - line_end+=2; | ||
| 119 | - | ||
| 120 | - memmove(this->buffer, | ||
| 121 | - line_end, | ||
| 122 | - this->buffer_used - (line_end-this->buffer) + 1); | ||
| 123 | - | ||
| 124 | - this->buffer_used -= line_end-this->buffer; | ||
| 125 | - | ||
| 126 | - return line_end-this->buffer-2; | 117 | + return ret; |
| 127 | } | 118 | } |
| 128 | 119 | ||
| 129 | static | 120 | static |
| 130 | inline | 121 | inline |
| 131 | void | 122 | void |
| 132 | -httpRequestSkip(HttpRequestParser this) | 123 | +httpRequestSkip(char ** data) |
| 133 | { | 124 | { |
| 134 | - size_t skip; | ||
| 135 | - | ||
| 136 | - for (skip = 0; | ||
| 137 | - 0 != this->buffer[skip] | ||
| 138 | - && ! isalpha(this->buffer[skip]) | ||
| 139 | - && this->buffer_used > skip; | ||
| 140 | - skip++); | ||
| 141 | - | ||
| 142 | - memmove(this->buffer, | ||
| 143 | - &this->buffer[skip], | ||
| 144 | - this->buffer_used - skip + 1); | ||
| 145 | - | ||
| 146 | - this->buffer_used -= skip; | 125 | + for (; 0 != **data && ! isalpha(**data); *data++); |
| 147 | } | 126 | } |
| 148 | 127 | ||
| 149 | static | 128 | static |
| @@ -151,9 +130,9 @@ void | @@ -151,9 +130,9 @@ void | ||
| 151 | httpRequestParserParse(HttpRequestParser this) | 130 | httpRequestParserParse(HttpRequestParser this) |
| 152 | { | 131 | { |
| 153 | //static HttpRequest request = NULL; | 132 | //static HttpRequest request = NULL; |
| 133 | + char * data = this->buffer; | ||
| 154 | char * line; | 134 | char * line; |
| 155 | int cont = 1; | 135 | int cont = 1; |
| 156 | - int length; | ||
| 157 | 136 | ||
| 158 | //if(NULL == HttpRequest) { | 137 | //if(NULL == HttpRequest) { |
| 159 | // request = new(HttpRequest); | 138 | // request = new(HttpRequest); |
| @@ -163,38 +142,35 @@ httpRequestParserParse(HttpRequestParser this) | @@ -163,38 +142,35 @@ httpRequestParserParse(HttpRequestParser this) | ||
| 163 | switch(this->state) { | 142 | switch(this->state) { |
| 164 | case HTTP_REQUEST_GARBAGE: | 143 | case HTTP_REQUEST_GARBAGE: |
| 165 | puts("==skip garbage=="); | 144 | puts("==skip garbage=="); |
| 166 | - httpRequestSkip(this); | 145 | + httpRequestSkip(&data); |
| 167 | 146 | ||
| 168 | this->state = HTTP_REQUEST_START; | 147 | this->state = HTTP_REQUEST_START; |
| 169 | break; | 148 | break; |
| 170 | 149 | ||
| 171 | case HTTP_REQUEST_START: | 150 | case HTTP_REQUEST_START: |
| 172 | puts("==request line=="); | 151 | puts("==request line=="); |
| 173 | - if (-1 == httpRequestLineGet(this, &line)) { | 152 | + if (NULL == (line = httpRequestLineGet(&data))) { |
| 174 | cont = 0; | 153 | cont = 0; |
| 175 | break; | 154 | break; |
| 176 | } | 155 | } |
| 177 | 156 | ||
| 178 | printf("%s\n", line); | 157 | printf("%s\n", line); |
| 179 | - free(line); | ||
| 180 | this->state = HTTP_REQUEST_REQEUST_LINE_DONE; | 158 | this->state = HTTP_REQUEST_REQEUST_LINE_DONE; |
| 181 | break; | 159 | break; |
| 182 | 160 | ||
| 183 | case HTTP_REQUEST_REQEUST_LINE_DONE: | 161 | case HTTP_REQUEST_REQEUST_LINE_DONE: |
| 184 | puts("==read header=="); | 162 | puts("==read header=="); |
| 185 | - if (-1 == (length = httpRequestLineGet(this, &line))) { | 163 | + if (NULL == (line = httpRequestLineGet(&data))) { |
| 186 | cont = 0; | 164 | cont = 0; |
| 187 | break; | 165 | break; |
| 188 | } | 166 | } |
| 189 | 167 | ||
| 190 | - if (0 == length) { | ||
| 191 | - free(line); | 168 | + if (0 == strlen(line)) { |
| 192 | this->state = HTTP_REQUEST_HEADERS_DONE; | 169 | this->state = HTTP_REQUEST_HEADERS_DONE; |
| 193 | break; | 170 | break; |
| 194 | } | 171 | } |
| 195 | 172 | ||
| 196 | printf("%s\n", line); | 173 | printf("%s\n", line); |
| 197 | - free(line); | ||
| 198 | break; | 174 | break; |
| 199 | 175 | ||
| 200 | case HTTP_REQUEST_HEADERS_DONE: | 176 | case HTTP_REQUEST_HEADERS_DONE: |
| @@ -205,10 +181,18 @@ httpRequestParserParse(HttpRequestParser this) | @@ -205,10 +181,18 @@ httpRequestParserParse(HttpRequestParser this) | ||
| 205 | case HTTP_REQUEST_DONE: | 181 | case HTTP_REQUEST_DONE: |
| 206 | puts("==request done=="); | 182 | puts("==request done=="); |
| 207 | 183 | ||
| 184 | + memmove(this->buffer, | ||
| 185 | + data, | ||
| 186 | + this->buffer_used - (data - this->buffer) + 1); | ||
| 187 | + | ||
| 188 | + this->buffer_used -= data - this->buffer; | ||
| 189 | + | ||
| 208 | if (0 == this->buffer_used) { | 190 | if (0 == this->buffer_used) { |
| 209 | cont = 0; | 191 | cont = 0; |
| 210 | } | 192 | } |
| 211 | 193 | ||
| 194 | + this->state = HTTP_REQUEST_GARBAGE; | ||
| 195 | + | ||
| 212 | break; | 196 | break; |
| 213 | 197 | ||
| 214 | default: | 198 | default: |
Please
register
or
login
to post a comment