Merge remote-tracking branch 'rbalint/from-forked-daapd'

This commit is contained in:
Nick Mathewson 2013-12-24 12:27:24 -05:00
commit 471fbe3baf
3 changed files with 58 additions and 2 deletions

25
http.c
View File

@ -2150,6 +2150,14 @@ evhttp_read_header(struct evhttp_connection *evcon,
/* Disable reading for now */ /* Disable reading for now */
bufferevent_disable(evcon->bufev, EV_READ); bufferevent_disable(evcon->bufev, EV_READ);
/* Callback can shut down connection with negative return value */
if (req->header_cb != NULL) {
if ((*req->header_cb)(req, req->cb_arg) < 0) {
evhttp_connection_fail_(evcon, EVREQ_HTTP_EOF);
return;
}
}
/* Done reading headers, do the real work */ /* Done reading headers, do the real work */
switch (req->kind) { switch (req->kind) {
case EVHTTP_REQUEST: case EVHTTP_REQUEST:
@ -2658,7 +2666,8 @@ evhttp_send_reply_start(struct evhttp_request *req, int code,
} }
void void
evhttp_send_reply_chunk(struct evhttp_request *req, struct evbuffer *databuf) evhttp_send_reply_chunk_with_cb(struct evhttp_request *req, struct evbuffer *databuf,
void (*cb)(struct evhttp_connection *, void *), void *arg)
{ {
struct evhttp_connection *evcon = req->evcon; struct evhttp_connection *evcon = req->evcon;
struct evbuffer *output; struct evbuffer *output;
@ -2680,9 +2689,14 @@ evhttp_send_reply_chunk(struct evhttp_request *req, struct evbuffer *databuf)
if (req->chunked) { if (req->chunked) {
evbuffer_add(output, "\r\n", 2); evbuffer_add(output, "\r\n", 2);
} }
evhttp_write_buffer(evcon, NULL, NULL); evhttp_write_buffer(evcon, cb, arg);
} }
void
evhttp_send_reply_chunk(struct evhttp_request *req, struct evbuffer *databuf)
{
evhttp_send_reply_chunk_with_cb(req, databuf, NULL, NULL);
}
void void
evhttp_send_reply_end(struct evhttp_request *req) evhttp_send_reply_end(struct evhttp_request *req)
{ {
@ -3812,6 +3826,13 @@ evhttp_request_set_chunked_cb(struct evhttp_request *req,
req->chunk_cb = cb; req->chunk_cb = cb;
} }
void
evhttp_request_set_header_cb(struct evhttp_request *req,
int (*cb)(struct evhttp_request *, void *))
{
req->header_cb = cb;
}
void void
evhttp_request_set_error_cb(struct evhttp_request *req, evhttp_request_set_error_cb(struct evhttp_request *req,
void (*cb)(enum evhttp_request_error, void *)) void (*cb)(enum evhttp_request_error, void *))

View File

@ -38,6 +38,7 @@ extern "C" {
struct evbuffer; struct evbuffer;
struct event_base; struct event_base;
struct bufferevent; struct bufferevent;
struct evhttp_connection;
/** @file event2/http.h /** @file event2/http.h
* *
@ -407,6 +408,23 @@ void evhttp_send_reply_start(struct evhttp_request *req, int code,
*/ */
void evhttp_send_reply_chunk(struct evhttp_request *req, void evhttp_send_reply_chunk(struct evhttp_request *req,
struct evbuffer *databuf); struct evbuffer *databuf);
/**
Send another data chunk as part of an ongoing chunked reply.
The reply chunk consists of the data in databuf. After calling
evhttp_send_reply_chunk() databuf will be empty, but the buffer is
still owned by the caller and needs to be deallocated by the caller
if necessary.
@param req a request object
@param databuf the data chunk to send as part of the reply.
@param cb callback funcion
@param call back's argument.
*/
void evhttp_send_reply_chunk_with_cb(struct evhttp_request *, struct evbuffer *,
void (*cb)(struct evhttp_connection *, void *), void *arg);
/** /**
Complete a chunked reply, freeing the request as appropriate. Complete a chunked reply, freeing the request as appropriate.
@ -486,6 +504,15 @@ struct evhttp_request *evhttp_request_new(
void evhttp_request_set_chunked_cb(struct evhttp_request *, void evhttp_request_set_chunked_cb(struct evhttp_request *,
void (*cb)(struct evhttp_request *, void *)); void (*cb)(struct evhttp_request *, void *));
/**
* Register callback for additional parsing of request headers.
* @param cb will be called after receiving and parsing the full header.
* It allows analyzing the header and possibly closing the connection
* by returning a value < 0.
*/
void evhttp_request_set_header_cb(struct evhttp_request *,
int (*cb)(struct evhttp_request *, void *));
/** /**
* The different error types supported by evhttp * The different error types supported by evhttp
* *

View File

@ -120,6 +120,14 @@ struct {
* the regular callback. * the regular callback.
*/ */
void (*chunk_cb)(struct evhttp_request *, void *); void (*chunk_cb)(struct evhttp_request *, void *);
/*
* Callback added for forked-daapd so they can collect ICY
* (shoutcast) metadata from the http header. If return
* int is negative the connection will be closed.
*/
int (*header_cb)(struct evhttp_request *, void *);
/* /*
* Error callback - called when error is occured. * Error callback - called when error is occured.
* @see evhttp_request_error for error types. * @see evhttp_request_error for error types.