[Cherokee-commits] [3840] cherokee/trunk: Adds X-Real-IP header support to all the FastCGI, SCGI, uWSGI, and CGI
SVN at cherokee-project.com
SVN at cherokee-project.com
Thu Nov 19 12:27:28 CET 2009
Revision: 3840
http://svn.cherokee-project.com/changeset/3840
Author: alo
Date: 2009-11-19 12:27:27 +0100 (Thu, 19 Nov 2009)
Log Message:
-----------
Adds X-Real-IP header support to all the FastCGI, SCGI, uWSGI, and CGI
handlers. A new cherokee_x_real_ip class has been refactored so both
the logging subsystem and the handlers can use it. Three new QA tests
have been added as well.
Modified Paths:
--------------
cherokee/trunk/cherokee/Makefile.am
cherokee/trunk/cherokee/handler_cgi.h
cherokee/trunk/cherokee/handler_cgi_base.c
cherokee/trunk/cherokee/handler_cgi_base.h
cherokee/trunk/cherokee/logger.c
cherokee/trunk/qa/Makefile.am
Added Paths:
-----------
cherokee/trunk/cherokee/xrealip.c
cherokee/trunk/cherokee/xrealip.h
cherokee/trunk/qa/232-X-Real-IP-CGI.py
cherokee/trunk/qa/233-X-Real-IP-CGI-2.py
cherokee/trunk/qa/234-X-Real-IP-CGI-3.py
Modified: cherokee/trunk/cherokee/Makefile.am
===================================================================
--- cherokee/trunk/cherokee/Makefile.am 2009-11-18 16:34:32 UTC (rev 3839)
+++ cherokee/trunk/cherokee/Makefile.am 2009-11-19 11:27:27 UTC (rev 3840)
@@ -1353,7 +1353,9 @@
logger.h \
logger.c \
logger_writer.h \
-logger_writer.c
+logger_writer.c \
+xrealip.h \
+xrealip.c
libcherokee_client_la_SOURCES = \
Modified: cherokee/trunk/cherokee/handler_cgi.h
===================================================================
--- cherokee/trunk/cherokee/handler_cgi.h 2009-11-18 16:34:32 UTC (rev 3839)
+++ cherokee/trunk/cherokee/handler_cgi.h 2009-11-19 11:27:27 UTC (rev 3840)
@@ -88,7 +88,6 @@
const char *name, int name_len,
const char *content, int content_len);
-ret_t cherokee_handler_cgi_configure (cherokee_config_node_t *conf, cherokee_server_t *srv, cherokee_module_props_t **props);
ret_t cherokee_handler_cgi_props_free (cherokee_handler_cgi_props_t *props);
#endif /* CHEROKEE_HANDLER_CGI_H */
Modified: cherokee/trunk/cherokee/handler_cgi_base.c
===================================================================
--- cherokee/trunk/cherokee/handler_cgi_base.c 2009-11-18 16:34:32 UTC (rev 3839)
+++ cherokee/trunk/cherokee/handler_cgi_base.c 2009-11-19 11:27:27 UTC (rev 3840)
@@ -121,6 +121,7 @@
cherokee_list_t *i, *tmp;
cherokee_buffer_mrproper (&props->script_alias);
+ cherokee_x_real_ip_mrproper (&props->x_real_ip);
list_for_each_safe (i, tmp, &props->system_env) {
env_item_free (i);
@@ -153,6 +154,7 @@
INIT_LIST_HEAD (&props->system_env);
cherokee_buffer_init (&props->script_alias);
+ cherokee_x_real_ip_init (&props->x_real_ip);
props->is_error_handler = true;
props->change_user = false;
@@ -198,6 +200,11 @@
}
}
+ ret = cherokee_x_real_ip_configure (&props->x_real_ip, conf);
+ if (ret != ret_ok) {
+ return ret_error;
+ }
+
return ret_ok;
}
@@ -205,8 +212,9 @@
ret_t
cherokee_handler_cgi_base_free (cherokee_handler_cgi_base_t *cgi)
{
- if (cgi->file_handler)
+ if (cgi->file_handler) {
cherokee_handler_free (cgi->file_handler);
+ }
cherokee_buffer_mrproper (&cgi->data);
cherokee_buffer_mrproper (&cgi->executable);
@@ -239,11 +247,13 @@
cherokee_connection_t *conn,
cherokee_buffer_t *tmp)
{
- int re;
- ret_t ret;
- char *p;
- cuint_t p_len;
- cherokee_bind_t *bind = CONN_BIND(HANDLER_CONN(cgi));
+ int re;
+ ret_t ret;
+ char *p;
+ cuint_t p_len;
+ cherokee_boolean_t remote_addr_set;
+ cherokee_bind_t *bind = CONN_BIND(HANDLER_CONN(cgi));
+ cherokee_handler_cgi_base_props_t *cgi_props = HANDLER_CGI_BASE_PROPS(cgi);
char remote_ip[CHE_INET_ADDRSTRLEN+1];
CHEROKEE_TEMP(temp, 32);
@@ -264,17 +274,60 @@
CONN_VSRV(conn)->root.buf,
CONN_VSRV(conn)->root.len);
- /* The IP address of the client sending the request to the
- * server. This is not necessarily that of the user agent (such
- * as if the request came through a proxy).
+ /* REMOTE_(ADDR/PORT): X-Real-IP
*/
- memset (remote_ip, 0, sizeof(remote_ip));
- cherokee_socket_ntop (&conn->socket, remote_ip, sizeof(remote_ip)-1);
- set_env (cgi, "REMOTE_ADDR", remote_ip, strlen(remote_ip));
+ remote_addr_set = false;
- re = snprintf (temp, temp_size, "%d", SOCKET_SIN_PORT(&conn->socket));
- if (re > 0) {
- set_env (cgi, "REMOTE_PORT", temp, re);
+ if (cgi_props->x_real_ip.enabled)
+ {
+ /* The request has a X-REAL-IP entry */
+ ret = cherokee_header_get_known (&conn->header, header_x_real_ip, &p, &p_len);
+ if (ret == ret_ok)
+ {
+ /* The remote host is allowed to send it */
+ ret = cherokee_x_real_ip_is_allowed (&cgi_props->x_real_ip, &conn->socket);
+ if (ret == ret_ok) {
+ cuint_t i;
+ const char *port_end = NULL;
+ const char *colon = NULL;
+
+ for (i=0; i < p_len; i++) {
+ if (p[i] == ':') {
+ colon = &p[i];
+ break;
+ }
+ }
+
+ if (colon != NULL) {
+ port_end = colon + 1;
+ while ((*port_end >= '0') && (*port_end <= '9')) {
+ port_end++;
+ }
+
+ set_env (cgi, "REMOTE_ADDR", p, colon - p);
+ set_env (cgi, "REMOTE_PORT", colon+1, (port_end-2) - colon+1);
+ } else {
+ set_env (cgi, "REMOTE_ADDR", p, p_len);
+ }
+
+ remote_addr_set = true;
+ }
+ }
+ }
+
+ /* REMOTE_(ADDR/PORT): socket origin
+ */
+ if (! remote_addr_set) {
+ /* REMOTE_ADDR */
+ memset (remote_ip, 0, sizeof(remote_ip));
+ cherokee_socket_ntop (&conn->socket, remote_ip, sizeof(remote_ip)-1);
+ set_env (cgi, "REMOTE_ADDR", remote_ip, strlen(remote_ip));
+
+ /* REMOTE_PORT */
+ re = snprintf (temp, temp_size, "%d", SOCKET_SIN_PORT(&conn->socket));
+ if (re > 0) {
+ set_env (cgi, "REMOTE_PORT", temp, re);
+ }
}
/* HTTP_HOST and SERVER_NAME. The difference between them is that
Modified: cherokee/trunk/cherokee/handler_cgi_base.h
===================================================================
--- cherokee/trunk/cherokee/handler_cgi_base.h 2009-11-18 16:34:32 UTC (rev 3839)
+++ cherokee/trunk/cherokee/handler_cgi_base.h 2009-11-19 11:27:27 UTC (rev 3840)
@@ -31,6 +31,7 @@
#include "handler.h"
#include "list.h"
#include "connection.h"
+#include "xrealip.h"
#define SUPPORT_XSENDFILE
@@ -104,6 +105,7 @@
cherokee_boolean_t allow_xsendfile;
cherokee_boolean_t is_error_handler;
cherokee_boolean_t pass_req_headers;
+ cherokee_x_real_ip_t x_real_ip;
} cherokee_handler_cgi_base_props_t;
#define PROP_CGI_BASE(x) ((cherokee_handler_cgi_base_props_t *)(x))
Modified: cherokee/trunk/cherokee/logger.c
===================================================================
--- cherokee/trunk/cherokee/logger.c 2009-11-18 16:34:32 UTC (rev 3839)
+++ cherokee/trunk/cherokee/logger.c 2009-11-19 11:27:27 UTC (rev 3840)
@@ -27,6 +27,7 @@
#include "access.h"
#include "header.h"
#include "connection-protected.h"
+#include "xrealip.h"
#include <stdlib.h>
#include <string.h>
@@ -34,45 +35,20 @@
struct cherokee_logger_private {
- CHEROKEE_MUTEX_T (mutex);
- cherokee_boolean_t backup_mode;
-
- cherokee_boolean_t x_real_ip_enabled;
- cherokee_access_t *x_real_ip_access;
- cherokee_boolean_t x_real_ip_access_all;
+ CHEROKEE_MUTEX_T (mutex);
+ cherokee_boolean_t backup_mode;
+ cherokee_x_real_ip_t x_real_ip;
};
#define PRIV(x) (LOGGER(x)->priv)
-static ret_t
-add_access (char *address, void *data)
-{
- ret_t ret;
- cherokee_logger_t *logger = LOGGER(data);
- if (logger->priv->x_real_ip_access == NULL) {
- ret = cherokee_access_new (&logger->priv->x_real_ip_access);
- if (ret != ret_ok) {
- return ret;
- }
- }
-
- ret = cherokee_access_add (logger->priv->x_real_ip_access, address);
- if (ret != ret_ok) {
- return ret;
- }
-
- return ret_ok;
-
-}
-
ret_t
cherokee_logger_init_base (cherokee_logger_t *logger,
cherokee_plugin_info_t *info,
cherokee_config_node_t *config)
{
- ret_t ret;
- cherokee_config_node_t *subconf;
+ ret_t ret;
CHEROKEE_NEW_TYPE(priv, struct cherokee_logger_private);
/* Init the base class
@@ -88,28 +64,16 @@
/* Private
*/
- logger->priv->backup_mode = false;
- logger->priv->x_real_ip_enabled = false;
- logger->priv->x_real_ip_access = NULL;
- logger->priv->x_real_ip_access_all = false;
+ logger->priv->backup_mode = false;
+
+ CHEROKEE_MUTEX_INIT (&PRIV(logger)->mutex, NULL);
+ cherokee_x_real_ip_init (&logger->priv->x_real_ip);
- CHEROKEE_MUTEX_INIT (&PRIV(logger)->mutex, NULL);
-
/* Read the configuration
*/
- cherokee_config_node_read_bool (config, "x_real_ip_enabled",
- &logger->priv->x_real_ip_enabled);
-
- cherokee_config_node_read_bool (config, "x_real_ip_access_all",
- &logger->priv->x_real_ip_access_all);
-
- ret = cherokee_config_node_get (config, "x_real_ip_access", &subconf);
- if (ret == ret_ok) {
- ret = cherokee_config_node_read_list (subconf, NULL, add_access, logger);
- if (ret != ret_ok) {
- LOG_ERROR_S (CHEROKEE_ERROR_LOGGER_X_REAL_IP_PARSE);
- return ret_error;
- }
+ ret = cherokee_x_real_ip_configure (&logger->priv->x_real_ip, config);
+ if (ret != ret_ok) {
+ return ret_error;
}
return ret_ok;
@@ -129,9 +93,7 @@
}
if (logger->priv) {
- if (logger->priv->x_real_ip_access) {
- cherokee_access_free (logger->priv->x_real_ip_access);
- }
+ cherokee_x_real_ip_mrproper (&logger->priv->x_real_ip);
free (logger->priv);
}
@@ -208,15 +170,9 @@
/* Is the client allowed to use X-Real-IP?
*/
- if (! logger->priv->x_real_ip_access_all) {
- if (logger->priv->x_real_ip_access == NULL) {
- return ret_deny;
- }
-
- ret = cherokee_access_ip_match (logger->priv->x_real_ip_access, &conn->socket);
- if (ret != ret_ok) {
- return ret_deny;
- }
+ ret = cherokee_x_real_ip_is_allowed (&logger->priv->x_real_ip, &conn->socket);
+ if (ret != ret_ok) {
+ return ret_deny;
}
/* Store the X-Real-IP value
@@ -242,7 +198,7 @@
/* Deal with X-Real-IP
*/
- if (logger->priv->x_real_ip_enabled) {
+ if (logger->priv->x_real_ip.enabled) {
ret = parse_x_real_ip (logger, CONN(conn));
if (unlikely (ret == ret_error))
return ret_error;
Added: cherokee/trunk/cherokee/xrealip.c
===================================================================
--- cherokee/trunk/cherokee/xrealip.c (rev 0)
+++ cherokee/trunk/cherokee/xrealip.c 2009-11-19 11:27:27 UTC (rev 3840)
@@ -0,0 +1,116 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+
+/* Cherokee
+ *
+ * Authors:
+ * Alvaro Lopez Ortega <alvaro at alobbs.com>
+ *
+ * Copyright (C) 2001-2009 Alvaro Lopez Ortega
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of version 2 of the GNU General Public
+ * License as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA.
+ */
+
+#include "common-internal.h"
+#include "xrealip.h"
+
+
+ret_t
+cherokee_x_real_ip_init (cherokee_x_real_ip_t *real_ip)
+{
+ real_ip->enabled = false;
+ real_ip->access = NULL;
+ real_ip->access_all = false;
+
+ return ret_ok;
+}
+
+
+ret_t
+cherokee_x_real_ip_mrproper (cherokee_x_real_ip_t *real_ip)
+{
+ if (real_ip->access != NULL) {
+ cherokee_access_free (real_ip->access);
+ real_ip->access = NULL;
+ }
+
+ return ret_ok;
+}
+
+
+static ret_t
+add_access (char *address, void *data)
+{
+ ret_t ret;
+ cherokee_x_real_ip_t *real_ip = X_REAL_IP(data);
+
+ if (real_ip->access == NULL) {
+ ret = cherokee_access_new (&real_ip->access);
+ if (ret != ret_ok) {
+ return ret;
+ }
+ }
+
+ ret = cherokee_access_add (real_ip->access, address);
+ if (ret != ret_ok) {
+ return ret;
+ }
+
+ return ret_ok;
+
+}
+
+
+ret_t
+cherokee_x_real_ip_configure (cherokee_x_real_ip_t *real_ip,
+ cherokee_config_node_t *config)
+{
+ ret_t ret;
+ cherokee_config_node_t *subconf;
+
+ cherokee_config_node_read_bool (config, "x_real_ip_enabled", &real_ip->enabled);
+ cherokee_config_node_read_bool (config, "x_real_ip_access_all", &real_ip->access_all);
+
+ ret = cherokee_config_node_get (config, "x_real_ip_access", &subconf);
+ if (ret == ret_ok) {
+ ret = cherokee_config_node_read_list (subconf, NULL, add_access, real_ip);
+ if (ret != ret_ok) {
+ LOG_ERROR_S (CHEROKEE_ERROR_LOGGER_X_REAL_IP_PARSE);
+ return ret_error;
+ }
+ }
+
+ return ret_ok;
+}
+
+
+ret_t
+cherokee_x_real_ip_is_allowed (cherokee_x_real_ip_t *real_ip,
+ cherokee_socket_t *sock)
+{
+ ret_t ret;
+
+ if (! real_ip->access_all) {
+ if (real_ip->access == NULL) {
+ return ret_deny;
+ }
+
+ ret = cherokee_access_ip_match (real_ip->access, sock);
+ if (ret != ret_ok) {
+ return ret_deny;
+ }
+ }
+
+ return ret_ok;
+}
Added: cherokee/trunk/cherokee/xrealip.h
===================================================================
--- cherokee/trunk/cherokee/xrealip.h (rev 0)
+++ cherokee/trunk/cherokee/xrealip.h 2009-11-19 11:27:27 UTC (rev 3840)
@@ -0,0 +1,56 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+
+/* Cherokee
+ *
+ * Authors:
+ * Alvaro Lopez Ortega <alvaro at alobbs.com>
+ *
+ * Copyright (C) 2001-2009 Alvaro Lopez Ortega
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of version 2 of the GNU General Public
+ * License as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA.
+ */
+
+
+#if !defined (CHEROKEE_INSIDE_CHEROKEE_H) && !defined (CHEROKEE_COMPILATION)
+# error "Only <cherokee/cherokee.h> can be included directly, this file may disappear or change contents."
+#endif
+
+#ifndef CHEROKEE_X_REAL_IP_H
+#define CHEROKEE_X_REAL_IP_H
+
+#include <cherokee/common.h>
+#include <cherokee/buffer.h>
+#include <cherokee/config_node.h>
+#include <cherokee/access.h>
+
+CHEROKEE_BEGIN_DECLS
+
+typedef struct {
+ cherokee_boolean_t enabled;
+ cherokee_access_t *access;
+ cherokee_boolean_t access_all;
+} cherokee_x_real_ip_t;
+
+#define X_REAL_IP(o) ((cherokee_x_real_ip_t *)(o))
+
+
+ret_t cherokee_x_real_ip_init (cherokee_x_real_ip_t *real_ip);
+ret_t cherokee_x_real_ip_mrproper (cherokee_x_real_ip_t *real_ip);
+ret_t cherokee_x_real_ip_configure (cherokee_x_real_ip_t *real_ip, cherokee_config_node_t *conf);
+ret_t cherokee_x_real_ip_is_allowed (cherokee_x_real_ip_t *real_ip, cherokee_socket_t *sock);
+
+CHEROKEE_END_DECLS
+
+#endif /* CHEROKEE_X_REAL_IP_H */
Added: cherokee/trunk/qa/232-X-Real-IP-CGI.py
===================================================================
--- cherokee/trunk/qa/232-X-Real-IP-CGI.py (rev 0)
+++ cherokee/trunk/qa/232-X-Real-IP-CGI.py 2009-11-19 11:27:27 UTC (rev 3840)
@@ -0,0 +1,44 @@
+from base import *
+
+DIR = "x_real_ip_cgi_1"
+REMOTE_IP = "1.2.3.4"
+
+CONF = """
+vserver!1!rule!2320!match = directory
+vserver!1!rule!2320!match!directory = /%s
+vserver!1!rule!2320!handler = cgi
+vserver!1!rule!2320!handler!x_real_ip_enabled = 1
+vserver!1!rule!2320!handler!x_real_ip_access_all = 0
+vserver!1!rule!2320!handler!x_real_ip_access = ::1,127.0.0.1
+""" % (DIR)
+
+CGI_CODE = """#!/bin/sh
+
+echo "Content-Type: text/plain"
+echo
+
+echo "REMOTE_ADDR ->${REMOTE_ADDR}<-"
+echo
+"""
+
+class Test (TestBase):
+ def __init__ (self):
+ TestBase.__init__ (self, __file__)
+ self.name = "X-Real-IP to REMOTE_ADDR: CGI"
+
+ self.request = "GET /%s/test HTTP/1.0\r\n" % (DIR) + \
+ "X-Real-IP: %s\r\n" % (REMOTE_IP)
+ self.expected_error = 200
+ self.conf = CONF
+
+ def CustomTest (self):
+ body = self.reply.split ("\r\n\r\n")[1]
+
+ if "REMOTE_ADDR ->%s<-" %(REMOTE_IP) in body:
+ return 0
+
+ return -1
+
+ def Prepare (self, www):
+ d = self.Mkdir (www, DIR, 0777)
+ self.WriteFile (d, "test", 0555, CGI_CODE)
Added: cherokee/trunk/qa/233-X-Real-IP-CGI-2.py
===================================================================
--- cherokee/trunk/qa/233-X-Real-IP-CGI-2.py (rev 0)
+++ cherokee/trunk/qa/233-X-Real-IP-CGI-2.py 2009-11-19 11:27:27 UTC (rev 3840)
@@ -0,0 +1,47 @@
+from base import *
+
+DIR = "x_real_ip_cgi_2"
+REMOTE_IP = "2.3.4.5"
+REMOTE_PORT = "987"
+
+CONF = """
+vserver!1!rule!2330!match = directory
+vserver!1!rule!2330!match!directory = /%s
+vserver!1!rule!2330!handler = cgi
+vserver!1!rule!2330!handler!x_real_ip_enabled = 1
+vserver!1!rule!2330!handler!x_real_ip_access_all = 0
+vserver!1!rule!2330!handler!x_real_ip_access = ::1,127.0.0.1
+""" % (DIR)
+
+CGI_CODE = """#!/bin/sh
+
+echo "Content-Type: text/plain"
+echo
+
+echo "REMOTE_ADDR ->${REMOTE_ADDR}<-"
+echo "REMOTE_PORT ->${REMOTE_PORT}<-"
+echo
+"""
+
+class Test (TestBase):
+ def __init__ (self):
+ TestBase.__init__ (self, __file__)
+ self.name = "X-Real-IP to REMOTE_(ADDR,PORT): CGI"
+
+ self.request = "GET /%s/test HTTP/1.0\r\n" % (DIR) + \
+ "X-Real-IP: %s:%s\r\n" % (REMOTE_IP, REMOTE_PORT)
+ self.expected_error = 200
+ self.conf = CONF
+
+ def CustomTest (self):
+ body = self.reply.split ("\r\n\r\n")[1]
+
+ if ("REMOTE_ADDR ->%s<-" %(REMOTE_IP) in body and
+ "REMOTE_PORT ->%s<-" %(REMOTE_PORT) in body):
+ return 0
+
+ return -1
+
+ def Prepare (self, www):
+ d = self.Mkdir (www, DIR, 0777)
+ self.WriteFile (d, "test", 0555, CGI_CODE)
Added: cherokee/trunk/qa/234-X-Real-IP-CGI-3.py
===================================================================
--- cherokee/trunk/qa/234-X-Real-IP-CGI-3.py (rev 0)
+++ cherokee/trunk/qa/234-X-Real-IP-CGI-3.py 2009-11-19 11:27:27 UTC (rev 3840)
@@ -0,0 +1,46 @@
+from base import *
+
+DIR = "x_real_ip_cgi_3"
+
+CONF = """
+vserver!1!rule!2340!match = directory
+vserver!1!rule!2340!match!directory = /%s
+vserver!1!rule!2340!handler = cgi
+vserver!1!rule!2340!handler!x_real_ip_enabled = 1
+vserver!1!rule!2340!handler!x_real_ip_access_all = 0
+vserver!1!rule!2340!handler!x_real_ip_access = 9.9.9.9
+""" % (DIR)
+
+CGI_CODE = """#!/bin/sh
+
+echo "Content-Type: text/plain"
+echo
+
+echo "REMOTE_ADDR ->${REMOTE_ADDR}<-"
+echo
+"""
+
+class Test (TestBase):
+ def __init__ (self):
+ TestBase.__init__ (self, __file__)
+ self.name = "X-Real-IP denied: CGI"
+
+ self.request = "GET /%s/test HTTP/1.0\r\n" % (DIR) + \
+ "X-Real-IP: 1.1.1.1\r\n"
+ self.expected_error = 200
+ self.conf = CONF
+
+ def CustomTest (self):
+ body = self.reply.split ("\r\n\r\n")[1]
+
+ if "REMOTE_ADDR ->127.0.0.1<-" in body:
+ return 0
+
+ if "REMOTE_ADDR ->::1<-" in body:
+ return 0
+
+ return -1
+
+ def Prepare (self, www):
+ d = self.Mkdir (www, DIR, 0777)
+ self.WriteFile (d, "test", 0555, CGI_CODE)
Modified: cherokee/trunk/qa/Makefile.am
===================================================================
--- cherokee/trunk/qa/Makefile.am 2009-11-18 16:34:32 UTC (rev 3839)
+++ cherokee/trunk/qa/Makefile.am 2009-11-19 11:27:27 UTC (rev 3840)
@@ -236,7 +236,11 @@
228-Redir-Paths2.py \
229-Fullpath.py \
230-Fullpath2.py \
-231-POST-4extra.py
+231-POST-4extra.py \
+232-X-Real-IP-CGI.py \
+233-X-Real-IP-CGI-2.py \
+234-X-Real-IP-CGI-3.py
+
test:
./run-tests.py
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.octality.com/pipermail/cherokee-commits/attachments/20091119/d488ae1c/attachment-0001.htm
More information about the Cherokee-commits
mailing list