| 142 static void proxy_response_finished(HttpClient *client, void *userdata) { |
142 static void proxy_response_finished(HttpClient *client, void *userdata) { |
| 143 ProxyRequest *proxy = userdata; |
143 ProxyRequest *proxy = userdata; |
| 144 |
144 |
| 145 log_ereport(LOG_INFORM, "proxy_response_finished: %s", client->uri); |
145 log_ereport(LOG_INFORM, "proxy_response_finished: %s", client->uri); |
| 146 |
146 |
| 147 int ret = REQ_PROCEED; |
147 int ret = proxy->client->error == 0 ? REQ_PROCEED : REQ_ABORTED; |
| 148 if(!proxy->response_started) { |
148 if(!proxy->response_started) { |
| 149 protocol_status(proxy->sn, proxy->rq, 502, NULL); |
149 protocol_status(proxy->sn, proxy->rq, 502, NULL); |
| 150 ret = REQ_ABORTED; |
150 ret = REQ_ABORTED; |
| 151 } |
151 } |
| 152 |
152 |
| 211 } |
211 } |
| 212 |
212 |
| 213 static ssize_t proxy_response_write(HttpClient *client, void *buf, size_t nbytes, void *userdata) { |
213 static ssize_t proxy_response_write(HttpClient *client, void *buf, size_t nbytes, void *userdata) { |
| 214 ProxyRequest *proxy = userdata; |
214 ProxyRequest *proxy = userdata; |
| 215 ssize_t ret = net_write(proxy->sn->csd, buf, nbytes); |
215 ssize_t ret = net_write(proxy->sn->csd, buf, nbytes); |
| |
216 if(ret == 0) { |
| |
217 log_ereport(LOG_FAILURE, "proxy_response_write ret 0 wtf"); |
| |
218 } |
| |
219 |
| 216 if(ret < 0) { |
220 if(ret < 0) { |
| 217 IOStream *st = proxy->sn->csd; |
221 IOStream *st = proxy->sn->csd; |
| 218 if(st->io_errno == EWOULDBLOCK) { |
222 if(st->io_errno == EWOULDBLOCK) { |
| 219 log_ereport(LOG_INFORM, "proxy_response_write would block"); |
223 log_ereport(LOG_INFORM, "proxy_response_write would block"); |
| 220 // Is there already an poll event for csd? |
224 // Is there already an poll event for csd? |
| 243 proxy_unref(proxy); |
247 proxy_unref(proxy); |
| 244 log_ereport(LOG_FAILURE, "proxy_response_write: cannot add write poll"); |
248 log_ereport(LOG_FAILURE, "proxy_response_write: cannot add write poll"); |
| 245 } |
249 } |
| 246 return HTTP_CLIENT_CALLBACK_WOULD_BLOCK; |
250 return HTTP_CLIENT_CALLBACK_WOULD_BLOCK; |
| 247 } else { |
251 } else { |
| 248 log_ereport(LOG_FAILURE, "proxy_response_write failed: %s", strerror(st->io_errno)); |
252 log_ereport(LOG_FAILURE, "proxy_response_write failed: ret: %d: %s", (int)ret, strerror(st->io_errno)); |
| |
253 proxy->rq->rq_attr.keep_alive = 0; |
| 249 return HTTP_CLIENT_CALLBACK_ERROR; |
254 return HTTP_CLIENT_CALLBACK_ERROR; |
| 250 } |
255 } |
| 251 } |
256 } |
| 252 return ret; |
257 return ret; |
| 253 } |
258 } |