[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