src/server/safs/proxy.c

changeset 729
66afe8954ff9
parent 728
a815f30e368d
child 730
c190ce0aab98
equal deleted inserted replaced
728:a815f30e368d 729:66afe8954ff9
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 }

mercurial