| 161 nsapi_function_return(proxy->sn, proxy->rq, ret); |
161 nsapi_function_return(proxy->sn, proxy->rq, ret); |
| 162 |
162 |
| 163 proxy_unref(proxy); |
163 proxy_unref(proxy); |
| 164 } |
164 } |
| 165 |
165 |
| 166 static int proxy_request_read_event(EventHandler *eh, Event *event) { |
166 static int proxy_event(EventHandler *eh, Event *event) { |
| 167 ProxyRequest *proxy = event->cookie; |
167 ProxyRequest *proxy = event->cookie; |
| 168 if(http_client_process(proxy->client, event)) { |
168 if(http_client_process(proxy->client, event)) { |
| 169 if(proxy->client->error == 0) { |
169 if(proxy->client->error == 0) { |
| 170 return 1; |
170 return 1; |
| 171 } |
171 } |
| 172 } |
172 } |
| 173 return 0; |
173 return 0; |
| 174 } |
174 } |
| 175 |
175 |
| 176 static int proxy_request_read_finished(EventHandler *eh, Event *event) { |
176 static int proxy_event_finished(EventHandler *eh, Event *event) { |
| 177 ProxyRequest *proxy = event->cookie; |
177 ProxyRequest *proxy = event->cookie; |
| 178 proxy_unref(proxy); |
178 proxy_unref(proxy); |
| 179 return 0; |
179 return 0; |
| 180 } |
180 } |
| 181 |
181 |
| 190 ret = HTTP_CLIENT_CALLBACK_WOULD_BLOCK; |
190 ret = HTTP_CLIENT_CALLBACK_WOULD_BLOCK; |
| 191 // is there already an poll event for csd? |
191 // is there already an poll event for csd? |
| 192 if(!proxy->event.fn) { |
192 if(!proxy->event.fn) { |
| 193 proxy->ref++; |
193 proxy->ref++; |
| 194 proxy->event.cookie = proxy; |
194 proxy->event.cookie = proxy; |
| 195 proxy->event.fn = proxy_request_read_event; |
195 proxy->event.fn = proxy_event; |
| 196 proxy->event.finish = proxy_request_read_finished; |
196 proxy->event.finish = proxy_event_finished; |
| 197 if(event_pollin(client->ev, st, &proxy->event)) { |
197 if(event_pollin(client->ev, st, &proxy->event)) { |
| 198 ret = HTTP_CLIENT_CALLBACK_ERROR; |
198 ret = HTTP_CLIENT_CALLBACK_ERROR; |
| 199 } |
199 } |
| 200 } |
200 } |
| 201 } else { |
201 } else { |
| 212 if(ret == NETBUF_EOF) { |
212 if(ret == NETBUF_EOF) { |
| 213 ret = HTTP_CLIENT_CALLBACK_ERROR; |
213 ret = HTTP_CLIENT_CALLBACK_ERROR; |
| 214 } else if(ret < 0) { |
214 } else if(ret < 0) { |
| 215 IOStream *st = proxy->sn->csd; |
215 IOStream *st = proxy->sn->csd; |
| 216 if(st->io_errno == EWOULDBLOCK) { |
216 if(st->io_errno == EWOULDBLOCK) { |
| |
217 log_ereport(LOG_INFORM, "proxy_response_write would block"); |
| 217 // Is there already an poll event for csd? |
218 // Is there already an poll event for csd? |
| 218 if(client->last_event == &proxy->event) { |
219 if(client->last_event == &proxy->event) { |
| 219 // Yes, there is already an event, and it even is the event that triggert this call. |
220 // Yes, there is already an event, and it even is the event that triggert this call. |
| 220 // Make sure it is a write event |
221 // Make sure it is a write event |
| 221 proxy->event.events = EVENT_POLLOUT; |
222 proxy->event.events = EVENT_POLLOUT; |
| |
223 log_ereport(LOG_INFORM, "proxy_response_write pollout event already exists"); |
| 222 return HTTP_CLIENT_CALLBACK_WOULD_BLOCK; |
224 return HTTP_CLIENT_CALLBACK_WOULD_BLOCK; |
| 223 } else if(proxy->event.fn != NULL) { |
225 } else if(proxy->event.fn != NULL) { |
| 224 // There is an inactive event, probably a read event |
226 // There is an inactive event, probably a read event |
| 225 // Remove the old event before we add a write event |
227 // Remove the old event before we add a write event |
| 226 if(ev_remove_poll(client->ev, proxy->event.object)) { |
228 if(ev_remove_poll(client->ev, proxy->event.object)) { |
| 228 return HTTP_CLIENT_CALLBACK_ERROR; |
230 return HTTP_CLIENT_CALLBACK_ERROR; |
| 229 } |
231 } |
| 230 } else { |
232 } else { |
| 231 proxy->ref++; |
233 proxy->ref++; |
| 232 proxy->event.cookie = proxy; |
234 proxy->event.cookie = proxy; |
| 233 proxy->event.fn = proxy_request_read_event; |
235 proxy->event.fn = proxy_event; |
| 234 proxy->event.finish = proxy_request_read_finished; |
236 proxy->event.finish = proxy_event_finished; |
| 235 } |
237 } |
| 236 // Add write event |
238 // Add write event |
| |
239 log_ereport(LOG_INFORM, "proxy_response_write pollout"); |
| 237 if(event_pollout(client->ev, proxy->sn->csd, &proxy->event)) { |
240 if(event_pollout(client->ev, proxy->sn->csd, &proxy->event)) { |
| 238 proxy_unref(proxy); |
241 proxy_unref(proxy); |
| 239 log_ereport(LOG_FAILURE, "proxy_response_write: cannot add write poll"); |
242 log_ereport(LOG_FAILURE, "proxy_response_write: cannot add write poll"); |
| 240 } |
243 } |
| 241 return HTTP_CLIENT_CALLBACK_ERROR; |
244 return HTTP_CLIENT_CALLBACK_WOULD_BLOCK; |
| 242 } |
245 } |
| 243 } |
246 } |
| 244 return ret; |
247 return ret; |
| 245 } |
248 } |
| 246 |
249 |
| 268 if(!proxy->read_buf) { |
271 if(!proxy->read_buf) { |
| 269 return 1; |
272 return 1; |
| 270 } |
273 } |
| 271 |
274 |
| 272 proxy->event.cookie = proxy; |
275 proxy->event.cookie = proxy; |
| 273 proxy->event.fn = proxy_request_read_event; |
276 proxy->event.fn = proxy_event; |
| 274 proxy->event.finish = proxy_request_read_finished; |
277 proxy->event.finish = proxy_event_finished; |
| 275 if(event_pollin(client->ev, st, &proxy->event)) { |
278 if(event_pollin(client->ev, st, &proxy->event)) { |
| 276 return 1; |
279 return 1; |
| 277 } |
280 } |
| 278 proxy->ref++; |
281 proxy->ref++; |
| 279 } |
282 } |