| 37 #include <string.h> |
37 #include <string.h> |
| 38 #include <errno.h> |
38 #include <errno.h> |
| 39 |
39 |
| 40 static int client_connected(EventHandler *ev, Event *event); |
40 static int client_connected(EventHandler *ev, Event *event); |
| 41 static int client_io(EventHandler *ev, Event *event); |
41 static int client_io(EventHandler *ev, Event *event); |
| |
42 static int client_process(HttpClient *client, Event *event); |
| 42 static int client_finished(EventHandler *ev, Event *event); |
43 static int client_finished(EventHandler *ev, Event *event); |
| 43 |
44 |
| 44 static int client_send_buf(HttpClient *client); |
45 static int client_send_buf(HttpClient *client); |
| 45 static int client_send_request_body(HttpClient *client); |
46 static int client_send_request_body(HttpClient *client); |
| 46 static int client_read_response_header(HttpClient *client); |
47 static int client_read_response_header(HttpClient *client); |
| 237 client->socketfd = -1; |
238 client->socketfd = -1; |
| 238 } |
239 } |
| 239 return ret; |
240 return ret; |
| 240 } |
241 } |
| 241 |
242 |
| 242 int http_client_process(HttpClient *client) { |
243 int http_client_process(HttpClient *client, Event *event) { |
| 243 if(client->stage < 0) { |
244 int ret = client_process(client, event); |
| 244 return 0; |
245 if(ret && client->error == 0 && client->event.fn == NULL) { |
| 245 } |
246 if(client_start_poll(client)) { |
| 246 return client_io(client->ev, &client->event); |
247 client->error = 1; |
| |
248 } |
| |
249 } |
| |
250 return ret; |
| 247 } |
251 } |
| 248 |
252 |
| 249 size_t http_client_message_buf_size_available(HttpClient *client) { |
253 size_t http_client_message_buf_size_available(HttpClient *client) { |
| 250 return client->transfer_buffer_alloc - client->transfer_buffer_len; |
254 return client->transfer_buffer_alloc - client->transfer_buffer_len; |
| 251 } |
255 } |
| 294 return 0; |
298 return 0; |
| 295 } |
299 } |
| 296 |
300 |
| 297 static int client_connected(EventHandler *ev, Event *event) { |
301 static int client_connected(EventHandler *ev, Event *event) { |
| 298 HttpClient *client = event->cookie; |
302 HttpClient *client = event->cookie; |
| |
303 client->last_event = event; |
| 299 if(client->stage < 0) { |
304 if(client->stage < 0) { |
| 300 return 0; |
305 return 0; |
| 301 } |
306 } |
| 302 if(create_req_buffer(client)) { |
307 if(create_req_buffer(client)) { |
| 303 // TODO: set error |
308 // TODO: set error |
| 308 return client_io(ev, event); |
313 return client_io(ev, event); |
| 309 } |
314 } |
| 310 |
315 |
| 311 static int client_io(EventHandler *ev, Event *event) { |
316 static int client_io(EventHandler *ev, Event *event) { |
| 312 HttpClient *client = event->cookie; |
317 HttpClient *client = event->cookie; |
| |
318 return client_process(client, event); |
| |
319 } |
| |
320 |
| |
321 static int client_process(HttpClient *client, Event *event) { |
| |
322 client->last_event = event; |
| 313 if(client->stage < 0) { |
323 if(client->stage < 0) { |
| 314 return 0; |
324 return 0; |
| 315 } |
325 } |
| 316 |
326 |
| 317 if(client->stage == 0) { |
327 if(client->stage == 0) { |
| 328 } |
338 } |
| 329 } |
339 } |
| 330 } |
340 } |
| 331 |
341 |
| 332 // writing complete, switch to read events |
342 // writing complete, switch to read events |
| 333 event->events = EVENT_POLLIN; |
343 |
| |
344 if(client->event.events != EVENT_POLLIN) { |
| |
345 if(&client->event != event) { |
| |
346 // The current event, that invoked client_process, is not the |
| |
347 // actual HttpClient event. |
| |
348 // Remove the current HttpClient poll event and re-add it later |
| |
349 // if needed |
| |
350 if(ev_remove_poll(client->ev, client->socketfd)) { |
| |
351 client->error = 1; |
| |
352 return 1; |
| |
353 } |
| |
354 client->event.fn = NULL; |
| |
355 } |
| |
356 client->event.events = EVENT_POLLIN; |
| |
357 |
| |
358 } |
| |
359 |
| 334 client->stage = 1; |
360 client->stage = 1; |
| 335 |
361 |
| 336 if(client_read_response_header(client)) { |
362 if(client_read_response_header(client)) { |
| 337 return client->error == 0; |
363 return client->error == 0; |
| 338 } |
364 } |
| 355 static int client_finished(EventHandler *ev, Event *event) { |
381 static int client_finished(EventHandler *ev, Event *event) { |
| 356 HttpClient *client = event->cookie; |
382 HttpClient *client = event->cookie; |
| 357 |
383 |
| 358 close(client->socketfd); |
384 close(client->socketfd); |
| 359 client->socketfd = -1; |
385 client->socketfd = -1; |
| |
386 client->stage = -1; |
| 360 |
387 |
| 361 // request finished |
388 // request finished |
| 362 if(client->response_finished) { |
389 if(client->response_finished) { |
| 363 client->response_finished(client, client->response_finished_userdata); |
390 client->response_finished(client, client->response_finished_userdata); |
| 364 } |
391 } |
| 379 } |
406 } |
| 380 |
407 |
| 381 if(w <= 0) { |
408 if(w <= 0) { |
| 382 if(errno != EAGAIN) { |
409 if(errno != EAGAIN) { |
| 383 // TODO: log correct host |
410 // TODO: log correct host |
| 384 log_ereport(LOG_VERBOSE, "http-client %s - %s: write failed: %s", "localhost", client->uri, strerror(errno)); |
411 log_ereport(LOG_FAILURE, "http-client %s - %s: write failed: %s", "localhost", client->uri, strerror(errno)); |
| 385 client->error = 1; |
412 client->error = 1; |
| 386 } |
413 } |
| 387 return 1; |
414 return 1; |
| 388 } |
415 } |
| 389 |
416 |