web_main.c
changeset 25 a1e271de54c2
parent 24 8307d28329ae
child 26 6d615203d963
equal deleted inserted replaced
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);