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 | 101 | |
102 | 102 | static |
103 | 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 | 110 | if (NULL == line_end) { |
110 | - *line = NULL; | |
111 | - return -1; | |
111 | + return NULL; | |
112 | 112 | } |
113 | 113 | |
114 | 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 | 120 | static |
130 | 121 | inline |
131 | 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 | 128 | static |
... | ... | @@ -151,9 +130,9 @@ void |
151 | 130 | httpRequestParserParse(HttpRequestParser this) |
152 | 131 | { |
153 | 132 | //static HttpRequest request = NULL; |
133 | + char * data = this->buffer; | |
154 | 134 | char * line; |
155 | 135 | int cont = 1; |
156 | - int length; | |
157 | 136 | |
158 | 137 | //if(NULL == HttpRequest) { |
159 | 138 | // request = new(HttpRequest); |
... | ... | @@ -163,38 +142,35 @@ httpRequestParserParse(HttpRequestParser this) |
163 | 142 | switch(this->state) { |
164 | 143 | case HTTP_REQUEST_GARBAGE: |
165 | 144 | puts("==skip garbage=="); |
166 | - httpRequestSkip(this); | |
145 | + httpRequestSkip(&data); | |
167 | 146 | |
168 | 147 | this->state = HTTP_REQUEST_START; |
169 | 148 | break; |
170 | 149 | |
171 | 150 | case HTTP_REQUEST_START: |
172 | 151 | puts("==request line=="); |
173 | - if (-1 == httpRequestLineGet(this, &line)) { | |
152 | + if (NULL == (line = httpRequestLineGet(&data))) { | |
174 | 153 | cont = 0; |
175 | 154 | break; |
176 | 155 | } |
177 | 156 | |
178 | 157 | printf("%s\n", line); |
179 | - free(line); | |
180 | 158 | this->state = HTTP_REQUEST_REQEUST_LINE_DONE; |
181 | 159 | break; |
182 | 160 | |
183 | 161 | case HTTP_REQUEST_REQEUST_LINE_DONE: |
184 | 162 | puts("==read header=="); |
185 | - if (-1 == (length = httpRequestLineGet(this, &line))) { | |
163 | + if (NULL == (line = httpRequestLineGet(&data))) { | |
186 | 164 | cont = 0; |
187 | 165 | break; |
188 | 166 | } |
189 | 167 | |
190 | - if (0 == length) { | |
191 | - free(line); | |
168 | + if (0 == strlen(line)) { | |
192 | 169 | this->state = HTTP_REQUEST_HEADERS_DONE; |
193 | 170 | break; |
194 | 171 | } |
195 | 172 | |
196 | 173 | printf("%s\n", line); |
197 | - free(line); | |
198 | 174 | break; |
199 | 175 | |
200 | 176 | case HTTP_REQUEST_HEADERS_DONE: |
... | ... | @@ -205,10 +181,18 @@ httpRequestParserParse(HttpRequestParser this) |
205 | 181 | case HTTP_REQUEST_DONE: |
206 | 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 | 190 | if (0 == this->buffer_used) { |
209 | 191 | cont = 0; |
210 | 192 | } |
211 | 193 | |
194 | + this->state = HTTP_REQUEST_GARBAGE; | |
195 | + | |
212 | 196 | break; |
213 | 197 | |
214 | 198 | default: | ... | ... |
Please
register
or
login
to post a comment