|
|
|
@ -356,7 +356,7 @@ static int proxy_establish_connection(server *srv, handler_ctx *hctx) {
|
|
|
|
|
"connect delayed:", proxy_fd);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return -proxy_fd;
|
|
|
|
|
return 1;
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
|
|
log_error_write(srv, __FILE__, __LINE__, "sdsd",
|
|
|
|
@ -371,7 +371,7 @@ static int proxy_establish_connection(server *srv, handler_ctx *hctx) {
|
|
|
|
|
log_error_write(srv, __FILE__, __LINE__, "sd",
|
|
|
|
|
"connect succeeded: ", proxy_fd);
|
|
|
|
|
}
|
|
|
|
|
return proxy_fd;
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static int proxy_create_env(server *srv, handler_ctx *hctx) {
|
|
|
|
@ -661,22 +661,48 @@ static int proxy_write_request(server *srv, handler_ctx *hctx) {
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
proxy_set_state(srv, hctx, PROXY_STATE_CONNECT);
|
|
|
|
|
/* fall through */
|
|
|
|
|
|
|
|
|
|
case PROXY_STATE_CONNECT:
|
|
|
|
|
/* try to finish the connect() */
|
|
|
|
|
hctx->fd = proxy_establish_connection(srv, hctx);
|
|
|
|
|
|
|
|
|
|
if (hctx->fd == -1) {
|
|
|
|
|
hctx->fde_ndx = -1;
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (hctx->fd < 0) {
|
|
|
|
|
hctx->fd = -hctx->fd;
|
|
|
|
|
proxy_set_state(srv, hctx, PROXY_STATE_CONNECT);
|
|
|
|
|
return 0;
|
|
|
|
|
if (hctx->state == PROXY_STATE_INIT) {
|
|
|
|
|
/* first round */
|
|
|
|
|
switch (proxy_establish_connection(srv, hctx)) {
|
|
|
|
|
case 1:
|
|
|
|
|
proxy_set_state(srv, hctx, PROXY_STATE_CONNECT);
|
|
|
|
|
|
|
|
|
|
/* connection is in progress, wait for an event and call getsockopt() below */
|
|
|
|
|
|
|
|
|
|
fdevent_event_add(srv->ev, &(hctx->fde_ndx), hctx->fd, FDEVENT_OUT);
|
|
|
|
|
|
|
|
|
|
return HANDLER_WAIT_FOR_EVENT;
|
|
|
|
|
case -1:
|
|
|
|
|
/* if ECONNREFUSED choose another connection -> FIXME */
|
|
|
|
|
hctx->fde_ndx = -1;
|
|
|
|
|
|
|
|
|
|
return HANDLER_ERROR;
|
|
|
|
|
default:
|
|
|
|
|
/* everything is ok, go on */
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
int socket_error;
|
|
|
|
|
socklen_t socket_error_len = sizeof(socket_error);
|
|
|
|
|
|
|
|
|
|
/* try to finish the connect() */
|
|
|
|
|
if (0 != getsockopt(hctx->fd, SOL_SOCKET, SO_ERROR, &socket_error, &socket_error_len)) {
|
|
|
|
|
log_error_write(srv, __FILE__, __LINE__, "ss",
|
|
|
|
|
"getsockopt failed:", strerror(errno));
|
|
|
|
|
|
|
|
|
|
return HANDLER_ERROR;
|
|
|
|
|
}
|
|
|
|
|
if (socket_error != 0) {
|
|
|
|
|
log_error_write(srv, __FILE__, __LINE__, "ss",
|
|
|
|
|
"establishing connection failed:", strerror(socket_error),
|
|
|
|
|
"port:", hctx->host->port);
|
|
|
|
|
|
|
|
|
|
return HANDLER_ERROR;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
proxy_set_state(srv, hctx, PROXY_STATE_PREPARE_WRITE);
|
|
|
|
|