Mercurial > urweb
comparison src/c/driver.c @ 742:43553c93dd8c
Reading blobs from the database
author | Adam Chlipala <adamc@hcoop.net> |
---|---|
date | Sun, 26 Apr 2009 10:45:59 -0400 |
parents | f7e2026dd5ae |
children | 3e5d1c6ae30c |
comparison
equal
deleted
inserted
replaced
741:f7e2026dd5ae | 742:43553c93dd8c |
---|---|
146 } | 146 } |
147 | 147 |
148 static void *worker(void *data) { | 148 static void *worker(void *data) { |
149 int me = *(int *)data, retries_left = MAX_RETRIES; | 149 int me = *(int *)data, retries_left = MAX_RETRIES; |
150 uw_context ctx = new_context(); | 150 uw_context ctx = new_context(); |
151 size_t buf_size = 1; | 151 size_t buf_size = 2; |
152 char *buf = malloc(buf_size); | 152 char *buf = malloc(buf_size); |
153 | 153 |
154 while (1) { | 154 while (1) { |
155 char *back = buf, *s, *post; | 155 char *back = buf, *s, *post; |
156 int sock, dont_close = 0; | 156 int sock, dont_close = 0; |
165 | 165 |
166 while (1) { | 166 while (1) { |
167 unsigned retries_left = MAX_RETRIES; | 167 unsigned retries_left = MAX_RETRIES; |
168 int r; | 168 int r; |
169 | 169 |
170 if (back - buf == buf_size) { | 170 if (back - buf == buf_size - 1) { |
171 char *new_buf; | 171 char *new_buf; |
172 buf_size *= 2; | 172 buf_size *= 2; |
173 new_buf = realloc(buf, buf_size); | 173 new_buf = realloc(buf, buf_size); |
174 back = new_buf + (back - buf); | 174 back = new_buf + (back - buf); |
175 buf = new_buf; | 175 buf = new_buf; |
176 } | 176 } |
177 | 177 |
178 r = recv(sock, back, buf_size - (back - buf), 0); | 178 r = recv(sock, back, buf_size - 1 - (back - buf), 0); |
179 | 179 |
180 if (r < 0) { | 180 if (r < 0) { |
181 fprintf(stderr, "Recv failed\n"); | 181 fprintf(stderr, "Recv failed\n"); |
182 break; | 182 break; |
183 } | 183 } |
233 fprintf(stderr, "Negative Content-length with POST\n"); | 233 fprintf(stderr, "Negative Content-length with POST\n"); |
234 goto done; | 234 goto done; |
235 } | 235 } |
236 | 236 |
237 while (back - after_headers < clen) { | 237 while (back - after_headers < clen) { |
238 if (back - buf == buf_size) { | 238 if (back - buf == buf_size - 1) { |
239 char *new_buf; | 239 char *new_buf; |
240 buf_size *= 2; | 240 buf_size *= 2; |
241 new_buf = realloc(buf, buf_size); | 241 new_buf = realloc(buf, buf_size); |
242 | |
242 back = new_buf + (back - buf); | 243 back = new_buf + (back - buf); |
244 headers = new_buf + (headers - buf); | |
245 uw_headers_moved(ctx, headers); | |
246 after_headers = new_buf + (after_headers - buf); | |
247 s = new_buf + (s - buf); | |
248 | |
243 buf = new_buf; | 249 buf = new_buf; |
244 } | 250 } |
245 | 251 |
246 r = recv(sock, back, buf_size - (back - buf), 0); | 252 r = recv(sock, back, buf_size - 1 - (back - buf), 0); |
247 | 253 |
248 if (r < 0) { | 254 if (r < 0) { |
249 fprintf(stderr, "Recv failed\n"); | 255 fprintf(stderr, "Recv failed\n"); |
250 goto done; | 256 goto done; |
251 } | 257 } |