src/server/proxy/httpclient.c

changeset 672
226bfd584075
parent 671
879005903b2b
child 673
144bdc33fdb6
equal deleted inserted replaced
671:879005903b2b 672:226bfd584075
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);
240 } 242 }
241 return 1; 243 return 1;
242 } 244 }
243 } 245 }
244 246
245 // make sure to receive read-ready events in the future 247 // writing complete, switch to read events
246 event->events |= EVENT_POLLIN; 248 event->events = EVENT_POLLIN;
247 249
248 250
249 char *buffer; 251 char *buffer;
250 size_t nbytes; 252 size_t nbytes;
251 if(client->header_complete) { 253 if(client->header_complete) {
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) {

mercurial