| 34 #include <string.h> |
34 #include <string.h> |
| 35 #include <errno.h> |
35 #include <errno.h> |
| 36 |
36 |
| 37 static int client_connected(EventHandler *ev, Event *event); |
37 static int client_connected(EventHandler *ev, Event *event); |
| 38 static int client_io(EventHandler *ev, Event *event); |
38 static int client_io(EventHandler *ev, Event *event); |
| |
39 static int client_finished(EventHandler *ev, Event *event); |
| 39 |
40 |
| 40 static int client_send_request(HttpClient *client); |
41 static int client_send_request(HttpClient *client); |
| 41 |
42 |
| 42 HttpClient* http_client_new(EventHandler *ev) { |
43 HttpClient* http_client_new(EventHandler *ev) { |
| 43 CxMempool *mp = cxMempoolCreate(32, CX_MEMPOOL_TYPE_PURE); |
44 CxMempool *mp = cxMempoolCreate(32, CX_MEMPOOL_TYPE_PURE); |
| 56 return NULL; |
57 return NULL; |
| 57 } |
58 } |
| 58 |
59 |
| 59 memset(client, 0, sizeof(HttpClient)); |
60 memset(client, 0, sizeof(HttpClient)); |
| 60 client->ev = ev; |
61 client->ev = ev; |
| |
62 client->socketfd = -1; |
| 61 client->request_headers = req_headers; |
63 client->request_headers = req_headers; |
| 62 client->response_headers = resp_headers; |
64 client->response_headers = resp_headers; |
| 63 |
65 |
| 64 client->buffer.maxsize = HTTP_CLIENT_BUFFER_SIZE; |
66 client->buffer.maxsize = HTTP_CLIENT_BUFFER_SIZE; |
| 65 client->buffer.inbuf = malloc(HTTP_CLIENT_BUFFER_SIZE); |
67 client->buffer.inbuf = malloc(HTTP_CLIENT_BUFFER_SIZE); |
| 265 case 0: { // finish |
267 case 0: { // finish |
| 266 if(!http_parser_validate(client->parser)) { |
268 if(!http_parser_validate(client->parser)) { |
| 267 client->error = 1; |
269 client->error = 1; |
| 268 return 0; |
270 return 0; |
| 269 } |
271 } |
| |
272 client->statuscode = client->parser->status; |
| 270 |
273 |
| 271 client->header_complete = 1; |
274 client->header_complete = 1; |
| 272 if(client->response_start) { |
275 if(client->response_start) { |
| 273 cxmutstr msg = client->parser->msg; |
276 cxmutstr msg = client->parser->msg; |
| 274 char t = msg.ptr[msg.length]; |
277 char t = msg.ptr[msg.length]; |
| 275 msg.ptr[msg.length] = 0; |
278 msg.ptr[msg.length] = 0; |
| 276 int ret = client->response_start(client, client->parser->status, msg.ptr, client->response_start_userdata); |
279 int ret = client->response_start(client, client->statuscode, msg.ptr, client->response_start_userdata); |
| 277 msg.ptr[msg.length] = t; |
280 msg.ptr[msg.length] = t; |
| 278 |
281 |
| 279 // TODO: check ret |
282 // TODO: check ret |
| 280 } |
283 } |
| 281 break; |
284 break; |
| 302 |
305 |
| 303 client->buffer.pos = 0; |
306 client->buffer.pos = 0; |
| 304 client->buffer.cursize = 0; |
307 client->buffer.cursize = 0; |
| 305 } |
308 } |
| 306 |
309 |
| |
310 if(r < 0) { |
| |
311 if(errno == EAGAIN) { |
| |
312 return 1; |
| |
313 } else { |
| |
314 log_ereport(LOG_FAILURE, "http-client: IO error: %s", strerror(errno)); |
| |
315 } |
| |
316 } |
| |
317 |
| |
318 // request finished |
| |
319 if(client->response_finished) { |
| |
320 client->response_finished(client, client->response_finished_userdata); |
| |
321 } |
| |
322 |
| |
323 return 0; |
| |
324 } |
| |
325 |
| |
326 static int client_finished(EventHandler *ev, Event *event) { |
| |
327 HttpClient *client = event->cookie; |
| |
328 |
| |
329 close(client->socketfd); |
| |
330 client->socketfd = -1; |
| |
331 |
| |
332 // request finished |
| |
333 if(client->response_finished) { |
| |
334 client->response_finished(client, client->response_finished_userdata); |
| |
335 } |
| 307 |
336 |
| 308 return 0; |
337 return 0; |
| 309 } |
338 } |
| 310 |
339 |
| 311 static int client_send_request(HttpClient *client) { |
340 static int client_send_request(HttpClient *client) { |