changeset 25 | a1e271de54c2 |
parent 24 | 8307d28329ae |
child 26 | 6d615203d963 |
24:8307d28329ae | 25:a1e271de54c2 |
---|---|
71 // setup flow-control |
71 // setup flow-control |
72 evhttp_set_reply_notify(ctx->http_request, HTTP_BUFFER, &_render_http_written, ctx); |
72 evhttp_set_reply_notify(ctx->http_request, HTTP_BUFFER, &_render_http_written, ctx); |
73 |
73 |
74 ctx->headers_sent = 1; |
74 ctx->headers_sent = 1; |
75 |
75 |
76 printf("render [%p]: sent headers\n", ctx); |
76 INFO("render [%p]: sent headers", ctx); |
77 } |
77 } |
78 |
78 |
79 static void _render_data (struct evbuffer *buf, void *arg) { |
79 static void _render_data (struct evbuffer *buf, void *arg) { |
80 struct render_request *ctx = arg; |
80 struct render_request *ctx = arg; |
81 |
81 |
84 assert(buf_size > 0); // shouldn't happen anymore with the new render_remote |
84 assert(buf_size > 0); // shouldn't happen anymore with the new render_remote |
85 |
85 |
86 // check if we are paused |
86 // check if we are paused |
87 if (ctx->paused) { |
87 if (ctx->paused) { |
88 // we are waiting for the HTTP send buffer to clear, so keep the data in the render buffer |
88 // we are waiting for the HTTP send buffer to clear, so keep the data in the render buffer |
89 printf("render [%p]: delaying data: %zu:%zu bytes\n", ctx, buf_size, ctx->bytes_sent); |
89 INFO("render [%p]: delaying data: %zu:%zu bytes", ctx, buf_size, ctx->bytes_sent); |
90 |
90 |
91 return; |
91 return; |
92 } |
92 } |
93 |
93 |
94 // move chunk to http buffers |
94 // move chunk to http buffers |
95 evhttp_send_reply_chunk(ctx->http_request, buf); |
95 evhttp_send_reply_chunk(ctx->http_request, buf); |
96 |
96 |
97 printf("render [%p]: enqueued chunk: %zu/%zu bytes\n", ctx, buf_size, ctx->bytes_sent); |
97 INFO("render [%p]: enqueued chunk: %zu/%zu bytes", ctx, buf_size, ctx->bytes_sent); |
98 |
98 |
99 // mark ourself as paused until httpd tells us to continue |
99 // mark ourself as paused until httpd tells us to continue |
100 ctx->paused = 1; |
100 ctx->paused = 1; |
101 |
101 |
102 // keep a tally of total sent bytes |
102 // keep a tally of total sent bytes |
107 struct render_request *ctx = arg; |
107 struct render_request *ctx = arg; |
108 |
108 |
109 // send end |
109 // send end |
110 evhttp_send_reply_end(ctx->http_request); |
110 evhttp_send_reply_end(ctx->http_request); |
111 |
111 |
112 printf("render [%p]: done: %zu bytes\n", ctx, ctx->bytes_sent); |
112 INFO("render [%p]: done: %zu bytes", ctx, ctx->bytes_sent); |
113 |
113 |
114 // the request is now done, clean up |
114 // the request is now done, clean up |
115 _render_cleanup(ctx); |
115 _render_cleanup(ctx); |
116 } |
116 } |
117 |
117 |
124 |
124 |
125 } else { |
125 } else { |
126 evhttp_send_error(ctx->http_request, 500, "Internal Server Error"); |
126 evhttp_send_error(ctx->http_request, 500, "Internal Server Error"); |
127 } |
127 } |
128 |
128 |
129 printf("render [%p]: failed\n", ctx); |
129 INFO("render [%p]: failed", ctx); |
130 |
130 |
131 _render_cleanup(ctx); |
131 _render_cleanup(ctx); |
132 } |
132 } |
133 |
133 |
134 static void _render_http_lost (struct evhttp_request *req, void *arg) { |
134 static void _render_http_lost (struct evhttp_request *req, void *arg) { |
135 struct render_request *ctx = arg; |
135 struct render_request *ctx = arg; |
136 |
136 |
137 printf("render [%p]: lost http connection\n", ctx); |
137 INFO("render [%p]: lost http connection", ctx); |
138 |
138 |
139 // cancel |
139 // cancel |
140 render_remote_cancel(ctx->render_info); |
140 render_remote_cancel(ctx->render_info); |
141 ctx->render_info = NULL; |
141 ctx->render_info = NULL; |
142 |
142 |
144 } |
144 } |
145 |
145 |
146 static void _render_http_written (struct evhttp_request *request, void *arg) { |
146 static void _render_http_written (struct evhttp_request *request, void *arg) { |
147 struct render_request *ctx = arg; |
147 struct render_request *ctx = arg; |
148 |
148 |
149 printf("render [%p]: http available for write\n", ctx); |
149 INFO("render [%p]: http available for write", ctx); |
150 |
150 |
151 // unpause ourself |
151 // unpause ourself |
152 ctx->paused = 0; |
152 ctx->paused = 0; |
153 |
153 |
154 // any data waiting in the buffer? |
154 // any data waiting in the buffer? |
191 render_remote_set_recv(ctx->render_info, MIN_CHUNK_SIZE, OVERFLOW_BUFFER); |
191 render_remote_set_recv(ctx->render_info, MIN_CHUNK_SIZE, OVERFLOW_BUFFER); |
192 |
192 |
193 // set close cb |
193 // set close cb |
194 evhttp_set_reply_abortcb(request, &_render_http_lost, ctx); |
194 evhttp_set_reply_abortcb(request, &_render_http_lost, ctx); |
195 |
195 |
196 printf("render [%p]: started\n", ctx); |
196 INFO("render [%p]: started", ctx); |
197 |
197 |
198 return; |
198 return; |
199 |
199 |
200 error: |
200 error: |
201 evhttp_send_error(request, 500, "Internal Server Error"); |
201 evhttp_send_error(request, 500, "Internal Server Error"); |
224 }; |
224 }; |
225 |
225 |
226 http_qarg_parse(request, qarg_spec); |
226 http_qarg_parse(request, qarg_spec); |
227 |
227 |
228 // request log |
228 // request log |
229 printf("REQ: [%s:%d] method=%d, uri=%s, img_w=%lu, img_h=%lu\n", peer_address, peer_port, evhttp_request_get_type(request), uri, img_w, img_h); |
229 INFO("REQ: [%s:%d] method=%d, uri=%s, img_w=%lu, img_h=%lu", peer_address, peer_port, evhttp_request_get_type(request), uri, img_w, img_h); |
230 |
230 |
231 // do it |
231 // do it |
232 _http_render_execute(request, img_w, img_h); |
232 _http_render_execute(request, img_w, img_h); |
233 } |
233 } |
234 |
234 |
235 struct event ev_sigint; |
235 struct event ev_sigint; |
236 |
236 |
237 void sigint_handler (int signal, short event, void *arg) { |
237 void sigint_handler (int signal, short event, void *arg) { |
238 printf("SIGINT: shutting down\n"); |
238 INFO("SIGINT: shutting down"); |
239 |
239 |
240 if (event_base_loopexit(ev_base, NULL)) |
240 if (event_base_loopexit(ev_base, NULL)) |
241 err_exit("event_loopexit"); |
241 err_exit("event_loopexit"); |
242 } |
242 } |
243 |
243 |
312 |
312 |
313 if (!pool_size) |
313 if (!pool_size) |
314 FATAL("No remote render nodes given"); |
314 FATAL("No remote render nodes given"); |
315 |
315 |
316 |
316 |
317 printf("Registered %d render nodes in our pool\n", pool_size); |
317 INFO("Registered %d render nodes in our pool", pool_size); |
318 |
318 |
319 // per default it is enabled |
319 // per default it is enabled |
320 if (!enable_debug) |
320 if (!enable_debug) |
321 event_set_log_callback(&log_null); |
321 event_set_log_callback(&log_null); |
322 |
322 |
335 |
335 |
336 // add our http request handler |
336 // add our http request handler |
337 evhttp_set_cb(http_server, "/render", &http_render, NULL); |
337 evhttp_set_cb(http_server, "/render", &http_render, NULL); |
338 |
338 |
339 // we shall now run |
339 // we shall now run |
340 printf("RUN 0.0.0.0:8117\n"); |
340 INFO("RUN 0.0.0.0:8117"); |
341 |
341 |
342 // run the libevent mainloop |
342 // run the libevent mainloop |
343 if (event_base_dispatch(ev_base)) |
343 if (event_base_dispatch(ev_base)) |
344 WARNING("event_dispatch"); |
344 WARNING("event_dispatch"); |
345 |
345 |
346 printf("SHUTDOWN\n"); |
346 INFO("SHUTDOWN"); |
347 |
347 |
348 // clean up |
348 // clean up |
349 signals_deinit(); |
349 signals_deinit(); |
350 evhttp_free(http_server); |
350 evhttp_free(http_server); |
351 event_base_free(ev_base); |
351 event_base_free(ev_base); |