Last active
December 25, 2015 18:39
-
-
Save kenshinx/7021997 to your computer and use it in GitHub Desktop.
Nginx C Module.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
addon_name=ngx_http_echo_module | |
HTTP_MODULES="$HTTP_MODULES ngx_http_echo_module" | |
NGX_ADDON_SRCS="$NGX_ADDON_SRCS $ngx_addon_dir/ngx_http_echo_module.c" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
*Nginx Http Echo Module | |
* | |
*/ | |
#include <ngx_config.h> | |
#include <ngx_core.h> | |
#include <ngx_http.h> | |
typedef struct { | |
ngx_str_t ed; | |
} ngx_http_echo_loc_conf_t; | |
static char *ngx_http_echo(ngx_conf_t *cf, ngx_command_t *cmd, void *conf); | |
static void *ngx_http_echo_create_loc_conf(ngx_conf_t *cf); | |
static char *ngx_http_echo_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child); | |
static ngx_command_t ngx_http_echo_commands[] = { | |
{ ngx_string("echo"), | |
NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, | |
ngx_http_echo, | |
NGX_HTTP_LOC_CONF_OFFSET, | |
offsetof(ngx_http_echo_loc_conf_t,ed), | |
NULL | |
}, | |
ngx_null_command | |
}; | |
static ngx_http_module_t ngx_http_echo_module_ctx = { | |
NULL, | |
NULL, | |
NULL, | |
NULL, | |
NULL, | |
NULL, | |
ngx_http_echo_create_loc_conf, | |
ngx_http_echo_merge_loc_conf, | |
}; | |
ngx_module_t ngx_http_echo_module = { | |
NGX_MODULE_V1, | |
&ngx_http_echo_module_ctx, | |
ngx_http_echo_commands, | |
NGX_HTTP_MODULE, | |
NULL, | |
NULL, | |
NULL, | |
NULL, | |
NULL, | |
NULL, | |
NULL, | |
NGX_MODULE_V1_PADDING | |
}; | |
static ngx_int_t | |
ngx_http_echo_handler(ngx_http_request_t *r) { | |
ngx_int_t rc; | |
ngx_buf_t *b; | |
ngx_chain_t out; | |
ngx_http_echo_loc_conf_t *elcf; | |
elcf = ngx_http_get_module_loc_conf(r, ngx_http_echo_module); | |
if (!(r->method &(NGX_HTTP_HEAD|NGX_HTTP_GET))) { | |
return NGX_HTTP_NOT_ALLOWED; | |
} | |
//ngx_str_t content_type = ngx_string("text/html"); | |
//r->headers_out.content_type = content_type; | |
r->headers_out.content_type.len = sizeof("text/html") -1; | |
r->headers_out.content_type.data = (u_char *) "text/html"; | |
r->headers_out.status = NGX_HTTP_OK; | |
r->headers_out.content_length_n = elcf->ed.len; | |
if (r->method == NGX_HTTP_HEAD) { | |
rc = ngx_http_send_header(r); | |
if (rc != NGX_OK) { | |
return rc; | |
} | |
} | |
b = ngx_pcalloc(r->pool, sizeof(ngx_buf_t)); | |
if (b == NULL) { | |
ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, "Failed to allocate response buffer."); | |
return NGX_HTTP_INTERNAL_SERVER_ERROR; | |
} | |
out.buf = b; | |
out.next = NULL; | |
b->pos = elcf->ed.data; | |
b->last = elcf->ed.data + (elcf->ed.len); | |
b->memory = 1; | |
b->last_buf = 1; | |
rc = ngx_http_send_header(r); | |
if (rc != NGX_OK) { | |
return rc; | |
} | |
return ngx_http_output_filter(r,&out); | |
} | |
static char * | |
ngx_http_echo(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) { | |
ngx_http_core_loc_conf_t *clcf; | |
clcf = ngx_http_conf_get_module_loc_conf(cf,ngx_http_core_module); | |
clcf->handler = ngx_http_echo_handler; | |
ngx_conf_set_str_slot(cf,cmd,conf); | |
return NGX_CONF_OK; | |
} | |
static void * | |
ngx_http_echo_create_loc_conf(ngx_conf_t *cf) { | |
ngx_http_echo_loc_conf_t *conf; | |
conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_echo_loc_conf_t)); | |
if (conf == NULL) { | |
return NGX_CONF_ERROR; | |
} | |
conf->ed.len = 0; | |
conf->ed.data = NULL; | |
return conf; | |
} | |
static char * | |
ngx_http_echo_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child) { | |
ngx_http_echo_loc_conf_t *prev = parent; | |
ngx_http_echo_loc_conf_t *conf = child; | |
ngx_conf_merge_str_value(conf->ed, prev->ed, ""); | |
return NGX_CONF_OK; | |
} | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment