mod_echo.c revision e8f95a682820a599fe41b22977010636be5c2717
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina/* Copyright 1999-2005 The Apache Software Foundation or its licensors, as
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina * applicable.
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina *
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina * Licensed under the Apache License, Version 2.0 (the "License");
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina * you may not use this file except in compliance with the License.
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina * You may obtain a copy of the License at
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina *
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina * http://www.apache.org/licenses/LICENSE-2.0
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina *
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina * Unless required by applicable law or agreed to in writing, software
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina * distributed under the License is distributed on an "AS IS" BASIS,
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina * See the License for the specific language governing permissions and
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina * limitations under the License.
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina */
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina#include "ap_config.h"
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina#include "ap_mmn.h"
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina#include "httpd.h"
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina#include "http_config.h"
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina#include "http_connection.h"
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina#include "apr_buckets.h"
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina#include "util_filter.h"
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březinamodule AP_MODULE_DECLARE_DATA echo_module;
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březinatypedef struct {
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina int bEnabled;
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina} EchoConfig;
50c9d542e8bf641412debaa82a4dcf67ddb72258Lukas Slebodnik
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březinastatic void *create_echo_server_config(apr_pool_t *p, server_rec *s)
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina{
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina EchoConfig *pConfig = apr_pcalloc(p, sizeof *pConfig);
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina
bbc34d5a6e84d6c337bd89a22d33e365eb466226Pavel Březina pConfig->bEnabled = 0;
28ebfa4373d1e7ce45b5d70a3619df1c074a661ePavel Březina
3a5ea81007bd38ce511c37f65cc45d4b6b95ec44Pavel Březina return pConfig;
641d684ee88c6540a4cf1d74d258614f615699fePavel Březina}
641d684ee88c6540a4cf1d74d258614f615699fePavel Březina
bbc34d5a6e84d6c337bd89a22d33e365eb466226Pavel Březinastatic const char *echo_on(cmd_parms *cmd, void *dummy, int arg)
c4d4fe1603420fe8f3d256a3a446974699563ff3Petr Cech{
c4d4fe1603420fe8f3d256a3a446974699563ff3Petr Cech EchoConfig *pConfig = ap_get_module_config(cmd->server->module_config,
c4d4fe1603420fe8f3d256a3a446974699563ff3Petr Cech &echo_module);
c4d4fe1603420fe8f3d256a3a446974699563ff3Petr Cech pConfig->bEnabled = arg;
c4d4fe1603420fe8f3d256a3a446974699563ff3Petr Cech
c4d4fe1603420fe8f3d256a3a446974699563ff3Petr Cech return NULL;
c4d4fe1603420fe8f3d256a3a446974699563ff3Petr Cech}
c4d4fe1603420fe8f3d256a3a446974699563ff3Petr Cech
c4d4fe1603420fe8f3d256a3a446974699563ff3Petr Cechstatic int process_echo_connection(conn_rec *c)
fd04b25eaa5cd105da4122854d8bc1e702760e60Jakub Hrozek{
b0e8c1802557645e2ff6a88c54c520b0f0ff9ebbPetr Cech apr_bucket_brigade *bb;
b0e8c1802557645e2ff6a88c54c520b0f0ff9ebbPetr Cech apr_bucket *b;
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina apr_status_t rv;
4e5e846de22407f825fe3b4040d79606818a2419Jakub Hrozek EchoConfig *pConfig = ap_get_module_config(c->base_server->module_config,
4e5e846de22407f825fe3b4040d79606818a2419Jakub Hrozek &echo_module);
4e5e846de22407f825fe3b4040d79606818a2419Jakub Hrozek
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina if (!pConfig->bEnabled) {
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina return DECLINED;
4e5e846de22407f825fe3b4040d79606818a2419Jakub Hrozek }
4e5e846de22407f825fe3b4040d79606818a2419Jakub Hrozek
4e5e846de22407f825fe3b4040d79606818a2419Jakub Hrozek do {
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina bb = apr_brigade_create(c->pool, c->bucket_alloc);
3688374991afb34bbaf2b7843683fc13dd77879dPavel Březina
3688374991afb34bbaf2b7843683fc13dd77879dPavel Březina /* Get a single line of input from the client */
3688374991afb34bbaf2b7843683fc13dd77879dPavel Březina if ((rv = ap_get_brigade(c->input_filters, bb, AP_MODE_GETLINE,
3688374991afb34bbaf2b7843683fc13dd77879dPavel Březina APR_BLOCK_READ, 0) != APR_SUCCESS ||
3688374991afb34bbaf2b7843683fc13dd77879dPavel Březina APR_BRIGADE_EMPTY(bb))) {
3688374991afb34bbaf2b7843683fc13dd77879dPavel Březina apr_brigade_destroy(bb);
3688374991afb34bbaf2b7843683fc13dd77879dPavel Březina break;
3688374991afb34bbaf2b7843683fc13dd77879dPavel Březina }
3688374991afb34bbaf2b7843683fc13dd77879dPavel Březina
3688374991afb34bbaf2b7843683fc13dd77879dPavel Březina /* Make sure the data is flushed to the client */
3688374991afb34bbaf2b7843683fc13dd77879dPavel Březina b = apr_bucket_flush_create(c->bucket_alloc);
3688374991afb34bbaf2b7843683fc13dd77879dPavel Březina APR_BRIGADE_INSERT_TAIL(bb, b);
3688374991afb34bbaf2b7843683fc13dd77879dPavel Březina
3688374991afb34bbaf2b7843683fc13dd77879dPavel Březina /* Send back the data. */
3688374991afb34bbaf2b7843683fc13dd77879dPavel Březina rv = ap_pass_brigade(c->output_filters, bb);
3688374991afb34bbaf2b7843683fc13dd77879dPavel Březina } while (rv == APR_SUCCESS);
3688374991afb34bbaf2b7843683fc13dd77879dPavel Březina
3688374991afb34bbaf2b7843683fc13dd77879dPavel Březina return OK;
3688374991afb34bbaf2b7843683fc13dd77879dPavel Březina}
3688374991afb34bbaf2b7843683fc13dd77879dPavel Březina
3688374991afb34bbaf2b7843683fc13dd77879dPavel Březinastatic const command_rec echo_cmds[] =
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina{
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina AP_INIT_FLAG("ProtocolEcho", echo_on, NULL, RSRC_CONF,
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina "Run an echo server on this host"),
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina { NULL }
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina};
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březinastatic void register_hooks(apr_pool_t *p)
e87b2a6e94c1066b3044fe683825ff5b4f8716c2Pavel Březina{
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina ap_hook_process_connection(process_echo_connection, NULL, NULL,
c4d4fe1603420fe8f3d256a3a446974699563ff3Petr Cech APR_HOOK_MIDDLE);
c4d4fe1603420fe8f3d256a3a446974699563ff3Petr Cech}
c4d4fe1603420fe8f3d256a3a446974699563ff3Petr Cech
c4d4fe1603420fe8f3d256a3a446974699563ff3Petr Cechmodule AP_MODULE_DECLARE_DATA echo_module = {
641d684ee88c6540a4cf1d74d258614f615699fePavel Březina STANDARD20_MODULE_STUFF,
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina NULL, /* create per-directory config structure */
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina NULL, /* merge per-directory config structures */
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina create_echo_server_config, /* create per-server config structure */
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina NULL, /* merge per-server config structures */
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina echo_cmds, /* command apr_table_t */
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina register_hooks /* register hooks */
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina};
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina