mod_echo.c revision 7a6f51e008161e40c80978add79ae744139c9a0c
842ae4bd224140319ae7feec1872b93dfd491143fielding#include "httpd.h"
842ae4bd224140319ae7feec1872b93dfd491143fielding#include "http_config.h"
842ae4bd224140319ae7feec1872b93dfd491143fielding#include "http_connection.h"
842ae4bd224140319ae7feec1872b93dfd491143fielding
842ae4bd224140319ae7feec1872b93dfd491143fieldingAPI_VAR_EXPORT module echo_module;
842ae4bd224140319ae7feec1872b93dfd491143fielding
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholestypedef struct
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes {
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes int bEnabled;
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes } EchoConfig;
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholesstatic void *create_echo_server_config(pool *p,server_rec *s)
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes {
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes EchoConfig *pConfig=ap_pcalloc(p,sizeof *pConfig);
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes pConfig->bEnabled=0;
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes return pConfig;
e8f95a682820a599fe41b22977010636be5c2717jim }
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes
e8f95a682820a599fe41b22977010636be5c2717jimstatic const char *echo_on(cmd_parms *cmd, void *dummy, char *arg)
1747d30b98aa1bdbc43994c02cd46ab4cb9319e4fielding {
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes EchoConfig *pConfig=ap_get_module_config(cmd->server->module_config,
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes &echo_module);
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes pConfig->bEnabled=1;
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes return NULL;
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes }
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholesstatic int process_echo_connection(conn_rec *c)
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes {
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes char buf[1024];
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes EchoConfig *pConfig=ap_get_module_config(c->base_server->module_config,
5c0419d51818eb02045cf923a9fe456127a44c60wrowe &echo_module);
5c0419d51818eb02045cf923a9fe456127a44c60wrowe
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes if(!pConfig->bEnabled)
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes return DECLINED;
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes for( ; ; )
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes {
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes int w;
d266c3777146d36a4c23c17aad6f153aebea1bf4jorton int r=ap_bread(c->client,buf,sizeof buf);
d266c3777146d36a4c23c17aad6f153aebea1bf4jorton if(r <= 0)
d266c3777146d36a4c23c17aad6f153aebea1bf4jorton break;
d266c3777146d36a4c23c17aad6f153aebea1bf4jorton w=ap_bwrite(c->client,buf,r);
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes if(w != r)
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes break;
22f8da8087791fcb95b836c8a81937c5a9bba202bnicholes ap_bflush(c->client);
22f8da8087791fcb95b836c8a81937c5a9bba202bnicholes }
22f8da8087791fcb95b836c8a81937c5a9bba202bnicholes return OK;
22f8da8087791fcb95b836c8a81937c5a9bba202bnicholes }
22f8da8087791fcb95b836c8a81937c5a9bba202bnicholes
22f8da8087791fcb95b836c8a81937c5a9bba202bnicholesstatic const command_rec echo_cmds[] = {
22f8da8087791fcb95b836c8a81937c5a9bba202bnicholes{ "ProtocolEcho", echo_on, NULL, RSRC_CONF, RAW_ARGS,
cd3bbd6d2df78d6c75e5d159a81ef8bdd5f70df9trawick "Run an echo server on this host" },
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes{ NULL }
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes};
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes
0568280364eb026393be492ebc732795c4934643jortonstatic void register_hooks()
0568280364eb026393be492ebc732795c4934643jorton {
0568280364eb026393be492ebc732795c4934643jorton ap_hook_process_connection(process_echo_connection,NULL,NULL,HOOK_MIDDLE);
0568280364eb026393be492ebc732795c4934643jorton }
0568280364eb026393be492ebc732795c4934643jorton
0568280364eb026393be492ebc732795c4934643jortonAPI_VAR_EXPORT module echo_module = {
0568280364eb026393be492ebc732795c4934643jorton STANDARD20_MODULE_STUFF,
0568280364eb026393be492ebc732795c4934643jorton NULL, /* pre_command_line */
0568280364eb026393be492ebc732795c4934643jorton NULL, /* pre_config */
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes NULL, /* post_config */
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes NULL, /* open_logs */
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes NULL, /* child_init */
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes NULL, /* create per-directory config structure */
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes NULL, /* merge per-directory config structures */
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes create_echo_server_config, /* create per-server config structure */
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes NULL, /* merge per-server config structures */
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes echo_cmds, /* command table */
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes NULL, /* handlers */
796e4a7141265d8ed7036e4628161c6eafb2a789jorton NULL, /* check auth */
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes NULL, /* check access */
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes register_hooks /* register hooks */
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes};
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes