| 330 static int client_process(HttpClient *client, Event *event) { |
330 static int client_process(HttpClient *client, Event *event) { |
| 331 client->last_event = event; |
331 client->last_event = event; |
| 332 if(client->stage < 0) { |
332 if(client->stage < 0) { |
| 333 return 0; |
333 return 0; |
| 334 } |
334 } |
| 335 log_ereport(LOG_INFORM, "client_process %d", client->stage); |
335 log_ereport(LOG_DEBUG, "client_process %d", client->stage); |
| 336 |
336 |
| 337 if(client->stage == 0) { |
337 if(client->stage == 0) { |
| 338 if(client->transfer_buffer_pos < client->transfer_buffer_len) { |
338 if(client->transfer_buffer_pos < client->transfer_buffer_len) { |
| 339 if(client_send_buf(client)) { |
339 if(client_send_buf(client)) { |
| 340 return client->error == 0; |
340 return client->error == 0; |
| 381 } |
381 } |
| 382 |
382 |
| 383 if(ret) { |
383 if(ret) { |
| 384 return client->error == 0; |
384 return client->error == 0; |
| 385 } |
385 } |
| 386 log_ereport(LOG_INFORM, "client_process end: %p", event->finish); |
386 log_ereport(LOG_DEBUG, "client_process end: %p", event->finish); |
| 387 |
387 |
| 388 if(event != &client->event) { |
388 if(event != &client->event) { |
| 389 // An extern event has called client_process, therefore the |
389 // An extern event has called client_process, therefore the |
| 390 // client_finished event callback is not automatically called. |
390 // client_finished event callback is not automatically called. |
| 391 // Manually shutdown the client: |
391 // Manually shutdown the client: |
| 392 log_ereport(LOG_INFORM, "client_process: manual shutdown"); |
392 log_ereport(LOG_DEBUG, "client_process: manual shutdown"); |
| 393 ev_remove_poll(client->ev, client->socketfd); |
393 ev_remove_poll(client->ev, client->socketfd); |
| 394 client_finished(client->ev, &client->event); |
394 client_finished(client->ev, &client->event); |
| 395 client->event.fn = NULL; |
395 client->event.fn = NULL; |
| 396 client->event.finish = NULL; |
396 client->event.finish = NULL; |
| 397 } |
397 } |
| 485 return r == 0 || client->error ? 0 : 1; |
485 return r == 0 || client->error ? 0 : 1; |
| 486 } |
486 } |
| 487 |
487 |
| 488 static int client_finished(EventHandler *ev, Event *event) { |
488 static int client_finished(EventHandler *ev, Event *event) { |
| 489 HttpClient *client = event->cookie; |
489 HttpClient *client = event->cookie; |
| 490 log_ereport(LOG_INFORM, "client_finished: %p", client->response_finished); |
490 log_ereport(LOG_DEBUG, "client_finished"); |
| 491 |
491 |
| 492 close(client->socketfd); |
492 close(client->socketfd); |
| 493 client->socketfd = -1; |
493 client->socketfd = -1; |
| 494 client->stage = -1; |
494 client->stage = -1; |
| 495 |
495 |
| 803 static int client_write_response(HttpClient *client) { |
803 static int client_write_response(HttpClient *client) { |
| 804 while(client->transfer2_buffer_pos < client->transfer2_buffer_len) { |
804 while(client->transfer2_buffer_pos < client->transfer2_buffer_len) { |
| 805 char *buf = client->transfer2_buffer + client->transfer2_buffer_pos; |
805 char *buf = client->transfer2_buffer + client->transfer2_buffer_pos; |
| 806 size_t len = client->transfer2_buffer_len - client->transfer2_buffer_pos; |
806 size_t len = client->transfer2_buffer_len - client->transfer2_buffer_pos; |
| 807 int ret = client->response_body_write(client, buf, len, client->response_body_write_userdata); |
807 int ret = client->response_body_write(client, buf, len, client->response_body_write_userdata); |
| 808 log_ereport(LOG_INFORM, "client_write_response: %d bytes; ret: %d", (int)len, ret); |
808 log_ereport(LOG_DEBUG, "client_write_response: %d bytes; ret: %d", (int)len, ret); |
| 809 if(ret > 0) { |
809 if(ret > 0) { |
| 810 client->transfer2_buffer_pos += ret; |
810 client->transfer2_buffer_pos += ret; |
| 811 } else if(ret == 0) { |
811 } else if(ret == 0) { |
| 812 // EOF? |
812 // EOF? |
| 813 // check if the write is incomplete, which would be an error |
813 // check if the write is incomplete, which would be an error |
| 848 } |
848 } |
| 849 } |
849 } |
| 850 } |
850 } |
| 851 |
851 |
| 852 if(r == 0) { |
852 if(r == 0) { |
| 853 log_ereport(LOG_INFORM, "client_read_response_body eof"); |
853 log_ereport(LOG_DEBUG, "client_read_response_body eof"); |
| 854 } |
854 } |
| 855 |
855 |
| 856 if(r < 0) { |
856 if(r < 0) { |
| 857 if(client->stream->st.io_errno == EWOULDBLOCK) { |
857 if(client->stream->st.io_errno == EWOULDBLOCK) { |
| 858 log_ereport(LOG_INFORM, "client_read_response_body would block"); |
858 log_ereport(LOG_DEBUG, "client_read_response_body would block"); |
| 859 } |
859 } |
| 860 |
860 |
| 861 if(client->stream->st.io_errno != EWOULDBLOCK) { |
861 if(client->stream->st.io_errno != EWOULDBLOCK) { |
| 862 client->error = 1; |
862 client->error = 1; |
| 863 } |
863 } |
| 864 return 1; |
864 return 1; |
| 865 } |
865 } |
| 866 log_ereport(LOG_INFORM, "client_read_response_body finished"); |
866 log_ereport(LOG_DEBUG, "client_read_response_body finished"); |
| 867 return 0; |
867 return 0; |
| 868 } |
868 } |
| 869 |
869 |
| 870 /* --------------------------------- Tests --------------------------------- */ |
870 /* --------------------------------- Tests --------------------------------- */ |
| 871 |
871 |