[patch iwhd] Factor out Microhttpd response
Pete Zaitcev
zaitcev at redhat.com
Mon Aug 8 23:43:42 UTC 2011
This patch fell out from the authentication work: if one needs something
new done in every place a response is formed (such as to supply a header
for authentication), then we have too many places to do it. However, the
code seems more straightforward with it alone. Shorter, too.
---
rest.c | 316 +++++++++++++++----------------------------------------
1 file changed, 87 insertions(+), 229 deletions(-)
diff --git a/rest.c b/rest.c
index 7bf8fe1..8c5b630 100644
--- a/rest.c
+++ b/rest.c
@@ -106,6 +106,8 @@ typedef struct {
MHD_AccessHandlerCallback handler;
} rule;
+static void simple_closer (void *ctx);
+
static unsigned short my_port = MY_PORT;
static LIST_HEAD(gc_list, _my_state) my_states; /* this keeps GC informed */
static pthread_mutex_t my_lock = PTHREAD_MUTEX_INITIALIZER;
@@ -168,6 +170,45 @@ validate_url (const char *url)
return !is_reserved(slash+1,reserved_name);
}
+static int do_resp(struct MHD_Connection *conn, my_state *ms,
+ unsigned int status_code, const char *etag,
+ const char *datastr)
+{
+ struct MHD_Response *resp;
+ size_t datalen = datastr? strlen(datastr): 0;
+
+ resp = MHD_create_response_from_data(datalen,(void *)datastr,
+ MHD_NO,MHD_NO);
+ if (!resp) {
+ return MHD_NO;
+ }
+
+ if (etag) {
+ MHD_add_response_header(resp,"ETag",etag);
+ }
+
+ MHD_queue_response(conn,status_code,resp);
+ MHD_destroy_response(resp);
+ return MHD_YES;
+}
+
+static int do_resp_from_cb(struct MHD_Connection *conn, my_state *ms,
+ ssize_t (*func)(void *ctx, uint64_t pos, char *buf, size_t max))
+{
+ struct MHD_Response *resp;
+
+ resp = MHD_create_response_from_callback(MHD_SIZE_UNKNOWN,
+ CB_BLOCK_SIZE, func, ms, simple_closer);
+ if (!resp) {
+ log_msg(0,"MHD_crfc failed");
+ simple_closer(ms);
+ return MHD_NO;
+ }
+ MHD_queue_response(conn,MHD_HTTP_OK,resp);
+ MHD_destroy_response(resp);
+ return MHD_YES;
+}
+
/**********
* The proxy has MHD on one side and CURL on the other. The CURL side is
* always run in a child thread. Yes, there are both context switches
@@ -312,11 +353,7 @@ proxy_get_data (void *cctx, struct MHD_Connection *conn, const char *url,
conn, MHD_HEADER_KIND, "If-None-Match");
if (user_etag && !strcmp(user_etag,my_etag)) {
DPRINTF("ETag match!\n");
- resp = MHD_create_response_from_data(0,NULL,
- MHD_NO,MHD_NO);
- MHD_queue_response(conn,MHD_HTTP_NOT_MODIFIED,resp);
- MHD_destroy_response(resp);
- return MHD_YES;
+ return do_resp(conn,ms,MHD_HTTP_NOT_MODIFIED,NULL,NULL);
}
ms->from_master = 0;
}
@@ -324,11 +361,7 @@ proxy_get_data (void *cctx, struct MHD_Connection *conn, const char *url,
DPRINTF("%s/%s not found locally\n",ms->bucket,ms->key);
if (!master_host) {
DPRINTF(" that means it doesn't exist\n");
- resp = MHD_create_response_from_data(0,NULL,
- MHD_NO,MHD_NO);
- MHD_queue_response(conn,MHD_HTTP_NOT_FOUND,resp);
- MHD_destroy_response(resp);
- return MHD_YES;
+ return do_resp(conn,ms,MHD_HTTP_NOT_FOUND,NULL,NULL);
}
DPRINTF(" will fetch from %s:%u\n", master_host,master_port);
ms->from_master = 1;
@@ -424,7 +457,6 @@ proxy_put_data (void *cctx, struct MHD_Connection *conn, const char *url,
const char *method, const char *version, const char *data,
size_t *data_size, void **rctx)
{
- struct MHD_Response *resp;
my_state *ms = *rctx;
int rc;
@@ -437,14 +469,7 @@ proxy_put_data (void *cctx, struct MHD_Connection *conn, const char *url,
if (ms->state == MS_NEW) {
if (!validate_put(conn) || !validate_url(url)) {
DPRINTF("rejecting %s\n",url);
- resp = MHD_create_response_from_data(0,NULL,
- MHD_NO,MHD_NO);
- if (!resp) {
- return MHD_NO;
- }
- MHD_queue_response(conn,MHD_HTTP_FORBIDDEN,resp);
- MHD_destroy_response(resp);
- return MHD_YES;
+ return do_resp(conn,ms,MHD_HTTP_FORBIDDEN,NULL,NULL);
}
ms->state = MS_NORMAL;
ms->url = strdup(url);
@@ -479,14 +504,8 @@ proxy_put_data (void *cctx, struct MHD_Connection *conn, const char *url,
rc = pipe_prod_wait_init(&ms->pipe);
if (rc != 0) {
DPRINTF("producer wait failed\n");
- resp = MHD_create_response_from_data(0,NULL,
- MHD_NO,MHD_NO);
- if (!resp) {
- return MHD_NO;
- }
- MHD_queue_response(conn,MHD_HTTP_INTERNAL_SERVER_ERROR,
- resp);
- MHD_destroy_response(resp);
+ return do_resp(conn,ms,MHD_HTTP_INTERNAL_SERVER_ERROR,
+ NULL,NULL);
} else if (rc > 0) {
/*
* Note that we fail here even if 1 of N replicas fail.
@@ -495,14 +514,8 @@ proxy_put_data (void *cctx, struct MHD_Connection *conn, const char *url,
*/
DPRINTF("producer replicas failed (%u of %u)\n",
rc, ms->pipe.cons_total);
- resp = MHD_create_response_from_data(0,NULL,
- MHD_NO,MHD_NO);
- if (!resp) {
- return MHD_NO;
- }
- MHD_queue_response(conn,MHD_HTTP_INTERNAL_SERVER_ERROR,
- resp);
- MHD_destroy_response(resp);
+ return do_resp(conn,ms,MHD_HTTP_INTERNAL_SERVER_ERROR,
+ NULL,NULL);
} else {
DPRINTF("producer proceeding\n");
}
@@ -540,15 +553,7 @@ proxy_put_data (void *cctx, struct MHD_Connection *conn, const char *url,
recheck_replication(ms,NULL);
rc = MHD_HTTP_CREATED;
}
- resp = MHD_create_response_from_data(0,NULL,MHD_NO,MHD_NO);
- if (!resp) {
- return MHD_NO;
- }
- if (etag) {
- MHD_add_response_header(resp,"ETag",etag);
- }
- MHD_queue_response(conn,rc,resp);
- MHD_destroy_response(resp);
+ return do_resp(conn,ms,rc,etag,NULL);
}
return MHD_YES;
@@ -581,14 +586,11 @@ proxy_list_attrs (void *cctx, struct MHD_Connection *conn, const char *url,
* means a request-specific routine (e.g. show_parts)
* created its own response. Therefore we shouldn't.
*/
- struct MHD_Response *resp
- = MHD_create_response_from_data(0,NULL, MHD_NO,MHD_NO);
- if (!resp) {
- log_msg(0,"MHD_crfd failed\n");
+ if (do_resp(conn,ms,rc,NULL,NULL) != MHD_YES) {
+ log_msg(0,"MHD_crfd failed");
return MHD_NO;
}
- MHD_queue_response(conn,rc,resp);
- MHD_destroy_response(resp);
+ return MHD_YES;
}
}
@@ -600,10 +602,8 @@ proxy_get_attr (void *cctx, struct MHD_Connection *conn, const char *url,
const char *method, const char *version, const char *data,
size_t *data_size, void **rctx)
{
- struct MHD_Response *resp;
char *fixed;
my_state *ms = *rctx;
- int rc = MHD_HTTP_NOT_FOUND;
(void)cctx;
(void)method;
@@ -614,20 +614,11 @@ proxy_get_attr (void *cctx, struct MHD_Connection *conn, const char *url,
DPRINTF("PROXY GET ATTR %s\n",url);
if (meta_get_value(ms->bucket,ms->key,ms->attr,&fixed) == 0) {
- resp = MHD_create_response_from_data(strlen(fixed),fixed,
- MHD_NO,MHD_NO);
- rc = MHD_HTTP_OK;
+ return do_resp(conn,ms,MHD_HTTP_OK,NULL,fixed);
}
else {
- resp = MHD_create_response_from_data(0,NULL,MHD_NO,MHD_NO);
+ return do_resp(conn,ms,MHD_HTTP_NOT_FOUND,NULL,NULL);
}
- if (!resp) {
- return MHD_NO;
- }
- MHD_queue_response(conn,rc,resp);
- MHD_destroy_response(resp);
-
- return MHD_YES;
}
static int
@@ -635,7 +626,6 @@ proxy_put_attr (void *cctx, struct MHD_Connection *conn, const char *url,
const char *method, const char *version, const char *data,
size_t *data_size, void **rctx)
{
- struct MHD_Response *resp;
my_state *ms = *rctx;
int send_resp = 0;
@@ -684,15 +674,7 @@ proxy_put_attr (void *cctx, struct MHD_Connection *conn, const char *url,
return MHD_NO;
}
if (is_reserved(ms->attr,reserved_attr)) {
- resp = MHD_create_response_from_data(
- 0,NULL,MHD_NO,MHD_NO);
- if (!resp) {
- return MHD_NO;
- }
- MHD_queue_response(conn,MHD_HTTP_BAD_REQUEST,
- resp);
- MHD_destroy_response(resp);
- return MHD_YES;
+ return do_resp(conn,ms,MHD_HTTP_BAD_REQUEST,NULL,NULL);
}
meta_set_value(ms->bucket,ms->key,ms->attr,ms->pipe.data_ptr);
/*
@@ -705,12 +687,7 @@ proxy_put_attr (void *cctx, struct MHD_Connection *conn, const char *url,
}
if (send_resp) {
- resp = MHD_create_response_from_data(0,NULL,MHD_NO,MHD_NO);
- if (!resp) {
- return MHD_NO;
- }
- MHD_queue_response(conn,MHD_HTTP_CREATED,resp);
- MHD_destroy_response(resp);
+ return do_resp(conn,ms,MHD_HTTP_CREATED,NULL,NULL);
/*
* TBD: check if the attribute was a replication policy, and
* start/stop replication activities as appropriate.
@@ -887,7 +864,6 @@ proxy_query (void *cctx, struct MHD_Connection *conn, const char *url,
const char *method, const char *version, const char *data,
size_t *data_size, void **rctx)
{
- struct MHD_Response *resp;
my_state *ms = *rctx;
(void)cctx;
@@ -932,21 +908,9 @@ proxy_query (void *cctx, struct MHD_Connection *conn, const char *url,
}
int rc = proxy_query_init(ms, ms->pipe.data_ptr);
if (rc != MHD_HTTP_OK) {
- resp = MHD_create_response_from_data(0,NULL,
- MHD_NO,MHD_NO);
- MHD_queue_response(conn,rc,resp);
- MHD_destroy_response(resp);
- return MHD_YES;
+ return do_resp(conn,ms,rc,NULL,NULL);
}
- resp = MHD_create_response_from_callback(MHD_SIZE_UNKNOWN,
- CB_BLOCK_SIZE, proxy_query_func, ms, simple_closer);
- if (!resp) {
- log_msg(0,"MHD_crfc failed");
- simple_closer(ms);
- return MHD_NO;
- }
- MHD_queue_response(conn,MHD_HTTP_OK,resp);
- MHD_destroy_response(resp);
+ return do_resp_from_cb(conn,ms,proxy_query_func);
}
return MHD_YES;
@@ -958,7 +922,6 @@ proxy_list_objs (void *cctx, struct MHD_Connection *conn, const char *url,
size_t *data_size, void **rctx)
{
my_state *ms = *rctx;
- struct MHD_Response *resp;
(void)cctx;
(void)url;
@@ -969,22 +932,9 @@ proxy_list_objs (void *cctx, struct MHD_Connection *conn, const char *url,
int rc = proxy_query_init(ms, NULL);
if (rc != MHD_HTTP_OK) {
- resp = MHD_create_response_from_data(0,NULL, MHD_NO,MHD_NO);
- MHD_queue_response(conn,rc,resp);
- MHD_destroy_response(resp);
- return MHD_YES;
+ return do_resp(conn,ms,rc,NULL,NULL);
}
- resp = MHD_create_response_from_callback(MHD_SIZE_UNKNOWN,
- CB_BLOCK_SIZE, proxy_query_func, ms, simple_closer);
- if (!resp) {
- log_msg(0,"MHD_crfc failed");
- simple_closer(ms);
- return MHD_NO;
- }
-
- MHD_queue_response(conn,MHD_HTTP_OK,resp);
- MHD_destroy_response(resp);
- return MHD_YES;
+ return do_resp_from_cb(conn,ms,proxy_query_func);
}
static int
@@ -993,7 +943,6 @@ proxy_delete (void *cctx, struct MHD_Connection *conn, const char *url,
size_t *data_size, void **rctx)
{
my_state *ms = *rctx;
- struct MHD_Response *resp;
char *copied_url;
char *bucket;
char *key;
@@ -1021,15 +970,7 @@ proxy_delete (void *cctx, struct MHD_Connection *conn, const char *url,
replicate_delete(url,ms);
}
- resp = MHD_create_response_from_data(0,NULL,MHD_NO,MHD_NO);
- if (!resp) {
- return MHD_NO;
- }
- log_msg(0, "DELETE BUCKET: rc=%d", rc);
- MHD_queue_response(conn,rc,resp);
- MHD_destroy_response(resp);
-
- return MHD_YES;
+ return do_resp(conn,ms,rc,NULL,NULL);
}
/* TBD: get actual bucket list */
@@ -1135,8 +1076,6 @@ proxy_api_root (void *cctx, struct MHD_Connection *conn, const char *url,
const char *method, const char *version, const char *data,
size_t *data_size, void **rctx)
{
- struct MHD_Response *resp = NULL;
- unsigned int rc = MHD_HTTP_OK;
my_state *ms = *rctx;
(void)cctx;
@@ -1150,16 +1089,7 @@ proxy_api_root (void *cctx, struct MHD_Connection *conn, const char *url,
if (!ms->query) {
return MHD_NO;
}
- resp = MHD_create_response_from_callback(MHD_SIZE_UNKNOWN,
- CB_BLOCK_SIZE, root_blob_generator, ms, simple_closer);
- if (!resp) {
- return MHD_NO;
- }
- MHD_queue_response(conn,rc,resp);
- MHD_destroy_response(resp);
-
- return MHD_YES;
-
+ return do_resp_from_cb(conn,ms,root_blob_generator);
}
static int
@@ -1331,8 +1261,8 @@ control_api_root (void *cctx, struct MHD_Connection *conn, const char *url,
}
if (len >= (int)sizeof(buf)) {
- len = 0;
- rc = MHD_HTTP_INTERNAL_SERVER_ERROR;
+ return do_resp(conn,ms,MHD_HTTP_INTERNAL_SERVER_ERROR,
+ NULL,NULL);
}
/* NB The last arg tells MHD to copy the arg and free it later. */
@@ -1351,7 +1281,6 @@ proxy_bucket_post (void *cctx, struct MHD_Connection *conn, const char *url,
const char *method, const char *version, const char *data,
size_t *data_size, void **rctx)
{
- struct MHD_Response *resp;
my_state *ms = *rctx;
char *key;
@@ -1400,13 +1329,10 @@ proxy_bucket_post (void *cctx, struct MHD_Connection *conn, const char *url,
else {
DPRINTF("A parameter is MISSING (fail)\n");
}
- resp = MHD_create_response_from_data(0,NULL,MHD_NO,MHD_NO);
- if (!resp) {
+ if (do_resp(conn,ms,rc,NULL,NULL) != MHD_YES) {
log_msg(0,"MHD_crfd failed");
return MHD_NO;
}
- MHD_queue_response(conn,rc,resp);
- MHD_destroy_response(resp);
}
return MHD_YES;
@@ -1548,16 +1474,9 @@ show_parts (struct MHD_Connection *conn, my_state *ms)
return MHD_HTTP_NOT_FOUND;
}
- struct MHD_Response *resp;
- resp = MHD_create_response_from_callback(MHD_SIZE_UNKNOWN,
- CB_BLOCK_SIZE, parts_callback, ms, simple_closer);
- if (!resp) {
- log_msg(0,"MHD_crfc failed");
- simple_closer(ms);
+ if (do_resp_from_cb(conn,ms,parts_callback) != MHD_YES) {
return MHD_NO;
}
- MHD_queue_response(conn,MHD_HTTP_OK,resp);
- MHD_destroy_response(resp);
return MHD_HTTP_PROCESSING;
}
@@ -1566,7 +1485,6 @@ proxy_object_post (void *cctx, struct MHD_Connection *conn, const char *url,
const char *method, const char *version, const char *data,
size_t *data_size, void **rctx)
{
- struct MHD_Response *resp;
my_state *ms = *rctx;
char *op;
@@ -1627,14 +1545,10 @@ proxy_object_post (void *cctx, struct MHD_Connection *conn, const char *url,
* means a request-specific routine (e.g. show_parts)
* created its own response. Therefore we shouldn't.
*/
- resp = MHD_create_response_from_data(0,NULL,
- MHD_NO,MHD_NO);
- if (!resp) {
+ if (do_resp(conn,ms,rc,NULL,NULL) != MHD_YES) {
log_msg(0,"MHD_crfd failed");
return MHD_NO;
}
- MHD_queue_response(conn,rc,resp);
- MHD_destroy_response(resp);
}
}
@@ -1828,7 +1742,6 @@ proxy_list_provs (void *cctx, struct MHD_Connection *conn, const char *url,
const char *method, const char *version, const char *data,
size_t *data_size, void **rctx)
{
- struct MHD_Response *resp;
my_state *ms = *rctx;
(void)cctx;
@@ -1838,17 +1751,7 @@ proxy_list_provs (void *cctx, struct MHD_Connection *conn, const char *url,
(void)data;
(void)data_size;
- resp = MHD_create_response_from_callback(MHD_SIZE_UNKNOWN,
- CB_BLOCK_SIZE, prov_list_generator, ms, simple_closer);
- if (!resp) {
- log_msg(0,"MHD_crfd failed");
- simple_closer(ms);
- return MHD_NO;
- }
- MHD_queue_response(conn,MHD_HTTP_OK,resp);
- MHD_destroy_response(resp);
-
- return MHD_YES;
+ return do_resp_from_cb(conn,ms,prov_list_generator);
}
static int
@@ -1887,6 +1790,7 @@ proxy_primary_prov (void *cctx, struct MHD_Connection *conn, const char *url,
const char *method, const char *version, const char *data,
size_t *data_size, void **rctx)
{
+ my_state *ms = *rctx;
(void)cctx;
(void)method;
(void)version;
@@ -1895,23 +1799,12 @@ proxy_primary_prov (void *cctx, struct MHD_Connection *conn, const char *url,
DPRINTF("PROXY GET PRIMARY PROVIDER (%s)\n", url);
// "/_providers/_primary" is the only one we accept for now.
- bool valid = strcmp (url, "/_providers/_primary") == 0;
- unsigned int rc = (valid ? MHD_HTTP_OK : MHD_HTTP_BAD_REQUEST);
- if (!valid)
+ if (strcmp (url, "/_providers/_primary") != 0) {
log_msg(0, _("invalid request: %s"), url);
-
- const char *name = get_main_provider()->name;
- struct MHD_Response *resp;
- resp = MHD_create_response_from_data(valid ? strlen (name) : 0,
- valid ? (void *) name : NULL,
- MHD_NO, MHD_NO);
- if (!resp) {
- return MHD_NO;
+ return do_resp(conn,ms,MHD_HTTP_BAD_REQUEST,NULL,NULL);
}
- MHD_queue_response(conn,rc,resp);
- MHD_destroy_response(resp);
- return MHD_YES;
+ return do_resp(conn,ms,MHD_HTTP_OK,NULL,get_main_provider()->name);
}
static int
@@ -1919,6 +1812,7 @@ proxy_set_primary (void *cctx, struct MHD_Connection *conn, const char *url,
const char *method, const char *version, const char *data,
size_t *data_size, void **rctx)
{
+ my_state *ms = *rctx;
(void)cctx;
(void)method;
(void)version;
@@ -1956,16 +1850,7 @@ proxy_set_primary (void *cctx, struct MHD_Connection *conn, const char *url,
}
bad_set:;
-
- struct MHD_Response *resp;
- resp = MHD_create_response_from_data(0, NULL, MHD_NO, MHD_NO);
- if (!resp) {
- return MHD_NO;
- }
- MHD_queue_response(conn,rc,resp);
- MHD_destroy_response(resp);
-
- return MHD_YES;
+ return do_resp(conn,ms,rc,NULL,NULL);
}
static int
@@ -1973,38 +1858,28 @@ proxy_delete_prov (void *cctx, struct MHD_Connection *conn, const char *url,
const char *method, const char *version, const char *data,
size_t *data_size, void **rctx)
{
- DPRINTF("PROXY DELETE PROVIDER %s\n",url);
+ my_state *ms = *rctx;
(void)cctx;
(void)method;
(void)version;
(void)data;
(void)data_size;
- struct MHD_Response *resp
- = MHD_create_response_from_data(0,NULL,MHD_NO,MHD_NO);
- if (!resp) {
- return MHD_NO;
- }
+ DPRINTF("PROXY DELETE PROVIDER %s\n",url);
char *prov_name = url_to_provider_name (url);
provider_t *prov = find_provider (prov_name);
+ if (!prov)
+ return do_resp(conn,ms,MHD_HTTP_NOT_FOUND,NULL,NULL);
+
// don't allow removal of current main provider.
if (prov == get_main_provider())
- prov = NULL;
-
- int rc = prov ? MHD_HTTP_OK : MHD_HTTP_NOT_FOUND;
-
- DPRINTF("PROXY DELETE PROVIDER prov=%s rc=%d\n", prov_name, rc);
+ return do_resp(conn,ms,MHD_HTTP_BAD_REQUEST,NULL,NULL);
- if (prov) {
- prov->deleted = 1;
- }
-
- MHD_queue_response(conn,rc,resp);
- MHD_destroy_response(resp);
-
- return MHD_YES;
+ DPRINTF("PROXY DELETE PROVIDER prov=%s rc=%d\n", prov_name,MHD_HTTP_OK);
+ prov->deleted = 1;
+ return do_resp(conn,ms,MHD_HTTP_OK,NULL,NULL);
}
static int
@@ -2013,7 +1888,6 @@ proxy_add_prov (void *cctx, struct MHD_Connection *conn, const char *url,
size_t *data_size, void **rctx)
{
DPRINTF("PROXY ADD PROVIDER %s\n",url);
- struct MHD_Response *resp;
my_state *ms = *rctx;
(void)cctx;
@@ -2072,13 +1946,10 @@ proxy_add_prov (void *cctx, struct MHD_Connection *conn, const char *url,
}
add_fail:
- resp = MHD_create_response_from_data(0,NULL,MHD_NO,MHD_NO);
- if (!resp) {
+ if (do_resp(conn,ms,rc,NULL,NULL) != MHD_YES) {
log_msg(0,"MHD_crfd failed");
return MHD_NO;
}
- MHD_queue_response(conn,rc,resp);
- MHD_destroy_response(resp);
}
return MHD_YES;
@@ -2101,15 +1972,10 @@ proxy_create_bucket (void *cctx, struct MHD_Connection *conn, const char *url,
/* curl -T moo.empty http://localhost:9090/_new by accident */
int rc = create_bucket(ms->bucket,ms);
- struct MHD_Response *resp
- = MHD_create_response_from_data(0,NULL, MHD_NO,MHD_NO);
- if (!resp) {
+ if (do_resp(conn,ms,rc,NULL,NULL) != MHD_YES) {
log_msg(0,"MHD_crfd failed");
return MHD_NO;
}
- MHD_queue_response(conn,rc,resp);
- MHD_destroy_response(resp);
-
return MHD_YES;
}
@@ -2227,7 +2093,6 @@ access_handler_0 (void *cctx, struct MHD_Connection *conn, const char *url,
{
unsigned int i;
url_type utype;
- struct MHD_Response *resp;
my_state *ms = *rctx;
log_check();
@@ -2272,15 +2137,8 @@ access_handler_0 (void *cctx, struct MHD_Connection *conn, const char *url,
return MHD_NO;
}
- log_msg(0,"bad request m=%s u=%s",method,url);
-
- resp = MHD_create_response_from_data(0,NULL,MHD_NO,MHD_NO);
- if (!resp) {
- return MHD_NO;
- }
- MHD_queue_response(conn,MHD_HTTP_NOT_FOUND,resp);
- MHD_destroy_response(resp);
- return MHD_YES;
+ log_msg(0,"bad request m=%s u=%s\n",method,url);
+ return do_resp(conn,ms,MHD_HTTP_NOT_FOUND,NULL,NULL);
}
static int
More information about the iwhd-devel
mailing list