src/server/proxy/httpclient.c

changeset 707
5fb102d2c745
parent 706
df64b4b79912
child 708
027b16665f13
equal deleted inserted replaced
706:df64b4b79912 707:5fb102d2c745
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

mercurial