mod_echo.c revision 64fe2907c3277c9b0c27bcb68bf935dc186c2162
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb#include "httpd.h"
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb#include "http_config.h"
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb#include "http_connection.h"
bc8fd1b0b1afdf89b8d28eefa8cd74e26ba97986fielding
b38846b15c8891c6dec44dcc4f96ca40721bf663rbbAPI_VAR_EXPORT module echo_module;
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb
b38846b15c8891c6dec44dcc4f96ca40721bf663rbbtypedef struct
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb {
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb int bEnabled;
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb } EchoConfig;
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb
b38846b15c8891c6dec44dcc4f96ca40721bf663rbbstatic void *create_echo_server_config(pool *p,server_rec *s)
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb {
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb EchoConfig *pConfig=ap_pcalloc(p,sizeof *pConfig);
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb pConfig->bEnabled=0;
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb return pConfig;
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb }
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb
b38846b15c8891c6dec44dcc4f96ca40721bf663rbbstatic const char *echo_on(cmd_parms *cmd, void *dummy, char *arg)
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb {
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb EchoConfig *pConfig=ap_get_module_config(cmd->server->module_config,
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb &echo_module);
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb pConfig->bEnabled=1;
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb return NULL;
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb }
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb
b38846b15c8891c6dec44dcc4f96ca40721bf663rbbstatic int process_echo_connection(conn_rec *c)
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb {
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb char buf[1024];
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb EchoConfig *pConfig=ap_get_module_config(c->base_server->module_config,
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb &echo_module);
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb if(!pConfig->bEnabled)
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb return DECLINED;
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb for( ; ; )
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb {
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb int w;
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb int r=ap_bread(c->client,buf,sizeof buf);
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb if(r <= 0)
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb break;
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb w=ap_bwrite(c->client,buf,r);
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb if(w != r)
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb break;
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb ap_bflush(c->client);
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb }
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb return OK;
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb }
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb
b38846b15c8891c6dec44dcc4f96ca40721bf663rbbstatic const command_rec echo_cmds[] = {
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb{ "ProtocolEcho", echo_on, NULL, RSRC_CONF, RAW_ARGS,
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb "Run an echo server on this host" },
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb{ NULL }
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb};
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb
b38846b15c8891c6dec44dcc4f96ca40721bf663rbbstatic void register_hooks()
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb {
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb ap_hook_process_connection(process_echo_connection,NULL,NULL,HOOK_MIDDLE);
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb }
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb
b38846b15c8891c6dec44dcc4f96ca40721bf663rbbAPI_VAR_EXPORT module echo_module = {
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb STANDARD20_MODULE_STUFF,
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb NULL, /* child_init */
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb NULL, /* create per-directory config structure */
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb NULL, /* merge per-directory config structures */
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb create_echo_server_config, /* create per-server config structure */
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb NULL, /* merge per-server config structures */
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb echo_cmds, /* command table */
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb NULL, /* handlers */
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb register_hooks /* register hooks */
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb};
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb