724
724
con->file_started = 1;
726
726
http_chunk_append_mem(srv, con, c + 4, blen + 1);
727
joblist_append(srv, con);
729
728
hctx->response->used = 0;
729
joblist_append(srv, con);
732
732
http_chunk_append_mem(srv, con, hctx->response->ptr, hctx->response->used);
759
758
(!host->host->used || !host->port)) return -1;
761
760
switch(hctx->state) {
761
case PROXY_STATE_CONNECT:
762
/* wait for the connect() to finish */
764
/* connect failed ? */
765
if (-1 == hctx->fde_ndx) return HANDLER_ERROR;
768
return HANDLER_WAIT_FOR_EVENT;
762
772
case PROXY_STATE_INIT:
763
773
#if defined(HAVE_IPV6) && defined(HAVE_INET_PTON)
764
774
if (strstr(host->host->ptr,":")) {
786
796
return HANDLER_ERROR;
791
case PROXY_STATE_CONNECT:
792
/* try to finish the connect() */
793
if (hctx->state == PROXY_STATE_INIT) {
795
switch (proxy_establish_connection(srv, hctx)) {
797
proxy_set_state(srv, hctx, PROXY_STATE_CONNECT);
799
/* connection is in progress, wait for an event and call getsockopt() below */
801
fdevent_event_set(srv->ev, &(hctx->fde_ndx), hctx->fd, FDEVENT_OUT);
803
return HANDLER_WAIT_FOR_EVENT;
805
/* if ECONNREFUSED choose another connection -> FIXME */
808
return HANDLER_ERROR;
810
/* everything is ok, go on */
815
socklen_t socket_error_len = sizeof(socket_error);
817
/* we don't need it anymore */
818
fdevent_event_del(srv->ev, &(hctx->fde_ndx), hctx->fd);
820
/* try to finish the connect() */
821
if (0 != getsockopt(hctx->fd, SOL_SOCKET, SO_ERROR, &socket_error, &socket_error_len)) {
822
log_error_write(srv, __FILE__, __LINE__, "ss",
823
"getsockopt failed:", strerror(errno));
825
return HANDLER_ERROR;
827
if (socket_error != 0) {
828
log_error_write(srv, __FILE__, __LINE__, "ss",
829
"establishing connection failed:", strerror(socket_error),
830
"port:", hctx->host->port);
832
return HANDLER_ERROR;
835
log_error_write(srv, __FILE__, __LINE__, "s", "proxy - connect - delayed success");
799
switch (proxy_establish_connection(srv, hctx)) {
801
proxy_set_state(srv, hctx, PROXY_STATE_CONNECT);
803
/* connection is in progress, wait for an event and call getsockopt() below */
805
fdevent_event_set(srv->ev, &(hctx->fde_ndx), hctx->fd, FDEVENT_OUT);
807
return HANDLER_WAIT_FOR_EVENT;
809
/* if ECONNREFUSED choose another connection -> FIXME */
812
return HANDLER_ERROR;
814
/* everything is ok, go on */
815
proxy_set_state(srv, hctx, PROXY_STATE_PREPARE_WRITE);
839
proxy_set_state(srv, hctx, PROXY_STATE_PREPARE_WRITE);
840
819
/* fall through */
841
821
case PROXY_STATE_PREPARE_WRITE:
842
822
proxy_create_env(srv, hctx);
1019
999
"proxy: fdevent-out", hctx->state);
1022
if (hctx->state == PROXY_STATE_CONNECT ||
1002
if (hctx->state == PROXY_STATE_CONNECT) {
1004
socklen_t socket_error_len = sizeof(socket_error);
1006
/* we don't need it anymore */
1007
fdevent_event_del(srv->ev, &(hctx->fde_ndx), hctx->fd);
1010
/* try to finish the connect() */
1011
if (0 != getsockopt(hctx->fd, SOL_SOCKET, SO_ERROR, &socket_error, &socket_error_len)) {
1012
log_error_write(srv, __FILE__, __LINE__, "ss",
1013
"getsockopt failed:", strerror(errno));
1015
joblist_append(srv, con);
1016
return HANDLER_FINISHED;
1018
if (socket_error != 0) {
1019
log_error_write(srv, __FILE__, __LINE__, "ss",
1020
"establishing connection failed:", strerror(socket_error),
1021
"port:", hctx->host->port);
1023
joblist_append(srv, con);
1024
return HANDLER_FINISHED;
1026
if (p->conf.debug) {
1027
log_error_write(srv, __FILE__, __LINE__, "s", "proxy - connect - delayed success");
1030
proxy_set_state(srv, hctx, PROXY_STATE_PREPARE_WRITE);
1033
if (hctx->state == PROXY_STATE_PREPARE_WRITE ||
1023
1034
hctx->state == PROXY_STATE_WRITE) {
1024
1035
/* we are allowed to send something out
1026
* 1. in a unfinished connect() call
1037
* 1. after a just finished connect() call
1027
1038
* 2. in a unfinished write() call (long POST request)
1029
1040
return mod_proxy_handle_subrequest(srv, con, p);