static isc_result_t render_500(const char *url, isc_httpdurl_t *urlinfo, const char *querystring, const char *headers, void *arg, unsigned int *retcode, const char **retmsg, const char **mimetype, isc_buffer_t *b, isc_httpdfree_t **freecb, void **freecb_args) { static char msg[] = "Internal server failure."; UNUSED(url); UNUSED(urlinfo); UNUSED(querystring); UNUSED(headers); UNUSED(arg); *retcode = 500; *retmsg = "Internal server failure"; *mimetype = "text/plain"; isc_buffer_reinit(b, msg, strlen(msg)); isc_buffer_add(b, strlen(msg)); *freecb = NULL; *freecb_args = NULL; return (ISC_R_SUCCESS); }
static isc_result_t render_index(const char *url, const char *querystring, void *arg, unsigned int *retcode, const char **retmsg, const char **mimetype, isc_buffer_t *b, isc_httpdfree_t **freecb, void **freecb_args) { unsigned char *msg; int msglen; ns_server_t *server = arg; isc_result_t result; UNUSED(url); UNUSED(querystring); result = generatexml(server, &msglen, &msg); if (result == ISC_R_SUCCESS) { *retcode = 200; *retmsg = "OK"; *mimetype = "text/xml"; isc_buffer_reinit(b, msg, msglen); isc_buffer_add(b, msglen); *freecb = wrap_xmlfree; *freecb_args = NULL; } return (result); }
/** * @pre closure points to a valid isc_buffer * @pre isc_buffer has non-NULL mctx * @pre isc_buffer has NULL buffer OR a buffer allocated from mctx * * @post closure contains \0 terminated string which is concatenation * of previous context and input text */ static void buffer_append_str(void *closure, const char *text, int textlen) { isc_buffer_t *out_buf = closure; isc_region_t new_space; isc_region_t old_space; REQUIRE(ISC_BUFFER_VALID(out_buf)); REQUIRE(out_buf->mctx != NULL); REQUIRE(text != NULL); /* Allocate sufficiently long output buffer. */ isc_buffer_region(out_buf, &old_space); new_space.length = isc_buffer_length(out_buf) + textlen + 1; new_space.base = isc_mem_get(out_buf->mctx, new_space.length); RUNTIME_CHECK(new_space.base != NULL); isc_buffer_reinit(out_buf, new_space.base, new_space.length); if (old_space.base != NULL) isc_mem_put(out_buf->mctx, old_space.base, old_space.length); /* Append output text and \0-terminate it. * Overwrite \0 at the end if needed. */ if (isc_buffer_usedlength(out_buf) != 0) /* Previous string is \0 terminated, chop \0. */ isc_buffer_subtract(out_buf, 1); isc_buffer_putstr(out_buf, text); isc_buffer_putuint8(out_buf, '\0'); }
static isc_result_t grow_headerspace(isc_httpd_t *httpd) { char *newspace; unsigned int newlen; isc_region_t r; newlen = httpd->headerlen + HTTP_SENDGROW; if (newlen > HTTP_SEND_MAXLEN) return (ISC_R_NOSPACE); newspace = isc_mem_get(httpd->mgr->mctx, newlen); if (newspace == NULL) return (ISC_R_NOMEMORY); isc_buffer_region(&httpd->headerbuffer, &r); isc_buffer_reinit(&httpd->headerbuffer, newspace, newlen); isc_mem_put(httpd->mgr->mctx, r.base, r.length); return (ISC_R_SUCCESS); }
static isc_result_t render_xsl(const char *url, const char *querystring, void *args, unsigned int *retcode, const char **retmsg, const char **mimetype, isc_buffer_t *b, isc_httpdfree_t **freecb, void **freecb_args) { UNUSED(url); UNUSED(querystring); UNUSED(args); *retcode = 200; *retmsg = "OK"; *mimetype = "text/xslt+xml"; isc_buffer_reinit(b, xslmsg, strlen(xslmsg)); isc_buffer_add(b, strlen(xslmsg)); *freecb = NULL; *freecb_args = NULL; return (ISC_R_SUCCESS); }
static isc_result_t render_404(const char *url, const char *querystring, void *arg, unsigned int *retcode, const char **retmsg, const char **mimetype, isc_buffer_t *b, isc_httpdfree_t **freecb, void **freecb_args) { static char msg[] = "No such URL."; UNUSED(url); UNUSED(querystring); UNUSED(arg); *retcode = 404; *retmsg = "No such URL"; *mimetype = "text/plain"; isc_buffer_reinit(b, msg, strlen(msg)); isc_buffer_add(b, strlen(msg)); *freecb = NULL; *freecb_args = NULL; return (ISC_R_SUCCESS); }