You are viewing a plain text version of this content. The canonical link for it is here.
Posted to mod_python-commits@quetz.apache.org by gr...@apache.org on 2003/07/12 05:44:53 UTC
cvs commit: httpd-python/src/include serverobject.h
grisha 2003/07/11 20:44:53
Modified: src requestobject.c serverobject.c
src/include serverobject.h
Log:
Server object is now a "new" python object.
Revision Changes Path
1.49 +46 -45 httpd-python/src/requestobject.c
Index: requestobject.c
===================================================================
RCS file: /home/cvs/httpd-python/src/requestobject.c,v
retrieving revision 1.48
retrieving revision 1.49
diff -u -r1.48 -r1.49
--- requestobject.c 3 Jul 2003 14:13:36 -0000 1.48
+++ requestobject.c 12 Jul 2003 03:44:53 -0000 1.49
@@ -881,50 +881,6 @@
{ NULL, NULL } /* sentinel */
};
-/**
- ** getmakeobj
- **
- * A getter func that creates an object as needed.
- */
-
-static PyObject *getmakeobj(requestobject* self, void *objname)
-{
- char *name = (char *)objname;
- PyObject *result = NULL;
-
- if (strcmp(name, "connection") == 0) {
- if (!self->connection && self->request_rec->connection)
- self->connection = MpConn_FromConn(self->request_rec->connection);
- result = self->connection;
- }
- else if (strcmp(name, "server") == 0) {
- if (!self->server && self->request_rec->server)
- self->server = MpServer_FromServer(self->request_rec->server);
- result = self->server;
- }
- else if (strcmp(name, "next") == 0) {
- if (!self->next && self->request_rec->next)
- self->next = MpRequest_FromRequest(self->request_rec->next);
- result = self->next;
- }
- else if (strcmp(name, "prev") == 0) {
- if (!self->prev && self->request_rec->prev)
- self->prev = MpRequest_FromRequest(self->request_rec->prev);
- result = self->prev;
- }
- else if (strcmp(name, "main") == 0) {
- if (!self->main && self->request_rec->main)
- self->main = MpRequest_FromRequest(self->request_rec->main);
- result = self->main;
- }
-
- if (!result)
- result = Py_None;
-
- Py_INCREF(result);
- return result;
-
-}
/*
These are offsets into the Apache request_rec structure.
@@ -1172,6 +1128,51 @@
apr_uri_t *uri = (apr_uri_t *)((char *)self->request_rec + md->offset);
return tuple_from_apr_uri(uri);
+}
+
+/**
+ ** getmakeobj
+ **
+ * A getter func that creates an object as needed.
+ */
+
+static PyObject *getmakeobj(requestobject* self, void *objname)
+{
+ char *name = (char *)objname;
+ PyObject *result = NULL;
+
+ if (strcmp(name, "connection") == 0) {
+ if (!self->connection && self->request_rec->connection)
+ self->connection = MpConn_FromConn(self->request_rec->connection);
+ result = self->connection;
+ }
+ else if (strcmp(name, "server") == 0) {
+ if (!self->server && self->request_rec->server)
+ self->server = MpServer_FromServer(self->request_rec->server);
+ result = self->server;
+ }
+ else if (strcmp(name, "next") == 0) {
+ if (!self->next && self->request_rec->next)
+ self->next = MpRequest_FromRequest(self->request_rec->next);
+ result = self->next;
+ }
+ else if (strcmp(name, "prev") == 0) {
+ if (!self->prev && self->request_rec->prev)
+ self->prev = MpRequest_FromRequest(self->request_rec->prev);
+ result = self->prev;
+ }
+ else if (strcmp(name, "main") == 0) {
+ if (!self->main && self->request_rec->main)
+ self->main = MpRequest_FromRequest(self->request_rec->main);
+ result = self->main;
+ }
+
+ if (!result)
+ result = Py_None;
+
+ Py_INCREF(result);
+ return result;
+
}
static PyGetSetDef request_getsets[] = {
1.17 +156 -82 httpd-python/src/serverobject.c
Index: serverobject.c
===================================================================
RCS file: /home/cvs/httpd-python/src/serverobject.c,v
retrieving revision 1.16
retrieving revision 1.17
diff -u -r1.16 -r1.17
--- serverobject.c 28 Feb 2003 04:38:16 -0000 1.16
+++ serverobject.c 12 Jul 2003 03:44:53 -0000 1.17
@@ -1,7 +1,7 @@
/* ====================================================================
* The Apache Software License, Version 1.1
*
- * Copyright (c) 2000-2002 The Apache Software Foundation. All rights
+ * Copyright (c) 2000-2003 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -80,6 +80,10 @@
if (! result)
return PyErr_NoMemory();
+ result->dict = PyDict_New();
+ if (!result->dict)
+ return PyErr_NoMemory();
+
result->server = s;
result->ob_type = &MpServer_Type;
result->next = NULL;
@@ -155,124 +159,167 @@
return Py_None;
}
-static PyMethodDef serverobjectmethods[] = {
+static PyMethodDef server_methods[] = {
{"get_config", (PyCFunction) server_get_config, METH_NOARGS},
{"register_cleanup", (PyCFunction) server_register_cleanup, METH_VARARGS},
{ NULL, NULL } /* sentinel */
};
+
+/*
+ These are offsets into the Apache server_rec structure.
+ They are accessed via getset functions. Note that the types
+ specified here are irrelevant if a function other than
+ getreq_recmbr() is used. E.g. bytes_sent is a long long,
+ and is retrieved via getreq_recmbr_off() which ignores what's
+ here.
+*/
+
#define OFF(x) offsetof(server_rec, x)
-static struct memberlist server_memberlist[] = {
- /* XXX process */
- /* next ? */
- {"defn_name", T_STRING, OFF(defn_name), RO},
- {"defn_line_number", T_INT, OFF(defn_line_number), RO},
- {"server_admin", T_STRING, OFF(server_admin), RO},
- {"server_hostname", T_STRING, OFF(server_hostname), RO},
- {"port", T_SHORT, OFF(port), RO},
- {"error_fname", T_STRING, OFF(error_fname), RO},
- {"loglevel", T_INT, OFF(loglevel), RO},
- {"is_virtual", T_INT, OFF(is_virtual), RO},
+static struct PyMemberDef server_rec_mbrs[] = {
+ {"defn_name", T_STRING, OFF(defn_name)},
+ {"defn_line_number", T_INT, OFF(defn_line_number)},
+ {"server_admin", T_STRING, OFF(server_admin)},
+ {"server_hostname", T_STRING, OFF(server_hostname)},
+ {"port", T_SHORT, OFF(port)},
+ {"error_fname", T_STRING, OFF(error_fname)},
+ {"loglevel", T_INT, OFF(loglevel)},
+ {"is_virtual", T_INT, OFF(is_virtual)},
/* XXX implement module_config ? */
/* XXX implement lookup_defaults ? */
/* XXX implement server_addr_rec ? */
- {"timeout", NULL, NULL, RO},
- {"keep_alive_timeout", NULL, NULL, RO},
- {"keep_alive_max", T_INT, OFF(keep_alive_max), RO},
- {"keep_alive", T_INT, OFF(keep_alive), RO},
+ {"timeout", T_LONG, OFF(timeout)},
+ {"keep_alive_timeout", T_LONG, OFF(keep_alive_timeout)},
+ {"keep_alive_max", T_INT, OFF(keep_alive_max)},
+ {"keep_alive", T_INT, OFF(keep_alive)},
/* XXX send_buffer_size gone. where? document */
/*{"send_buffer_size", T_INT, OFF(send_buffer_size), RO},*/
- {"path", T_STRING, OFF(path), RO},
- {"pathlen", T_INT, OFF(pathlen), RO},
- /* XXX names */
- /* XXX wild names */
+ {"path", T_STRING, OFF(path)},
+ {"pathlen", T_INT, OFF(pathlen)},
+ {"names", T_OBJECT, OFF(names)},
+ {"wild_names", T_OBJECT, OFF(wild_names)},
/* XXX server_uid and server_gid seem gone. Where? Document. */
/*{"server_uid", T_INT, OFF(server_uid), RO},*/
/*{"server_gid", T_INT, OFF(server_gid), RO},*/
/* XXX Document limit* below. Make RW? */
- {"limit_req_line", T_INT, OFF(limit_req_line), RO},
- {"limit_req_fieldsize", T_INT, OFF(limit_req_fieldsize),RO},
- {"limit_req_fields", T_INT, OFF(limit_req_fields), RO},
+ {"limit_req_line", T_INT, OFF(limit_req_line)},
+ {"limit_req_fieldsize", T_INT, OFF(limit_req_fieldsize)},
+ {"limit_req_fields", T_INT, OFF(limit_req_fields)},
{NULL} /* Sentinel */
};
/**
- ** server_dealloc
+ ** getsrv_recmbr
**
- *
+ * Retrieves server_rec structure members
*/
-static void server_dealloc(serverobject *self)
-{
+static PyObject *getsrv_recmbr(serverobject *self, void *name)
+{
+ return PyMember_GetOne((char*)self->server,
+ find_memberdef(server_rec_mbrs, name));
+}
- Py_XDECREF(self->next);
- free(self);
+/* we don't need setsrv_recmbr for now */
+
+/**
+ ** getsrv_recmbr_time
+ **
+ * Retrieves apr_time_t server_rec members
+ */
+
+static PyObject *getsrv_recmbr_time(serverobject *self, void *name)
+{
+ PyMemberDef *md = find_memberdef(server_rec_mbrs, name);
+ char *addr = (char *)self->server + md->offset;
+ apr_time_t time = *(apr_time_t*)addr;
+ return PyFloat_FromDouble(time*0.000001);
}
/**
- ** server_getattr
+ ** getsrv_rec_ah
**
- * Get server object attributes
- *
- *
+ * For array headers that will get converted to tuple
*/
-static PyObject * server_getattr(serverobject *self, char *name)
+static PyObject *getsrv_recmbr_ah(serverobject *self, void *name)
{
+ const PyMemberDef *md = find_memberdef(server_rec_mbrs, name);
+ apr_array_header_t *ah =
+ (apr_array_header_t *)((char *)self->server + md->offset);
- PyObject *res;
+ return tuple_from_array_header(ah);
+}
- res = Py_FindMethod(serverobjectmethods, (PyObject *)self, name);
- if (res != NULL)
- return res;
-
- PyErr_Clear();
+/**
+ ** getmakeobj
+ **
+ * A getter func that creates an object as needed.
+ */
- if (strcmp(name, "next") == 0)
- /* server.next serverobject is created as needed */
- if (self->next == NULL) {
- if (self->server->next == NULL) {
- Py_INCREF(Py_None);
- return Py_None;
- }
- else {
- self->next = MpServer_FromServer(self->server->next);
- Py_INCREF(self->next);
- return self->next;
- }
- }
- else {
- Py_INCREF(self->next);
- return self->next;
- }
+static PyObject *getmakeobj(serverobject* self, void *objname)
+{
+ char *name = (char *)objname;
+ PyObject *result = NULL;
- else if (strcmp(name, "error_log") == 0) {
- return PyInt_FromLong((long)fileno((FILE *)self->server->error_log));
+ if (strcmp(name, "next") == 0) {
+ if (!self->next && self->server->next)
+ self->next = MpServer_FromServer(self->server->next);
+ result = self->next;
}
- else if (strcmp(name, "names") == 0) {
- return tuple_from_array_header(self->server->names);
- }
- else if (strcmp(name, "wild_names") == 0) {
- return tuple_from_array_header(self->server->wild_names);
- }
- else if (strcmp(name, "my_generation") == 0) {
- return PyInt_FromLong((long)ap_my_generation);
- }
- else if (strcmp(name, "restart_time") == 0) {
- return PyInt_FromLong((long)ap_scoreboard_image->global->restart_time);
- }
- else if (strcmp(name, "timeout") == 0) {
- return PyLong_FromLongLong(self->server->timeout);
- }
- else if (strcmp(name, "keep_alive_timeout") == 0) {
- return PyLong_FromLongLong(self->server->keep_alive_timeout);
- }
- else
- return PyMember_Get((char *)self->server, server_memberlist, name);
+ if (!result)
+ result = Py_None;
+
+ Py_INCREF(result);
+ return result;
+}
+
+static PyGetSetDef server_getsets[] = {
+ /* XXX process */
+ {"next", (getter)getmakeobj, NULL, "The next server in the list", "next"},
+ {"defn_name", (getter)getsrv_recmbr, NULL, "The name of the server", "defn_name"},
+ {"defn_line_number", (getter)getsrv_recmbr, NULL,
+ "The line of the config file that the server was defined on", "defn_line_number"},
+ {"server_admin", (getter)getsrv_recmbr, NULL, "The admin's contact information", "server_admin"},
+ {"server_hostname", (getter)getsrv_recmbr, NULL, "The server hostname", "server_hostname"},
+ {"port", (getter)getsrv_recmbr, NULL, " for redirects, etc.", "port"},
+ {"error_fname", (getter)getsrv_recmbr, NULL, "The name of the error log", "error_fname"},
+ /* XXX error_log apr_file_t */
+ {"loglevel", (getter)getsrv_recmbr, NULL, "The log level for this server", "loglevel"},
+ {"is_virtual", (getter)getsrv_recmbr, NULL, "true if this is the virtual server", "is_virtual"},
+ {"timeout", (getter)getsrv_recmbr_time, NULL, "Timeout, as interval, before we give up", "timeout"},
+ {"keep_alive_timeout", (getter)getsrv_recmbr_time, NULL, "The apr interval we will wait for another request", "keep_alive_timeout"},
+ {"keep_alive_max", (getter)getsrv_recmbr, NULL, "Maximum requests per connection", "keep_alive_max"},
+ {"keep_alive", (getter)getsrv_recmbr, NULL, "Use persistent connections?", "keep_alive"},
+ {"path", (getter)getsrv_recmbr, NULL, "Pathname for ServerPath", "path"},
+ {"pathlen", (getter)getsrv_recmbr, NULL, "Length of path", "pathlen"},
+ {"names", (getter)getsrv_recmbr_ah, NULL, "Normal names for ServerAlias servers", "names"},
+ {"wild_names", (getter)getsrv_recmbr_ah, NULL, "Wildcarded names for ServerAlias servers", "wild_names"},
+ {"limit_req_line", (getter)getsrv_recmbr, NULL, "limit on size of the HTTP request line", "limit_req_line"},
+ {"limit_req_fieldsize", (getter)getsrv_recmbr, NULL, "limit on size of any request header field", "limit_req_fieldsize"},
+ {"limit_req_fields", (getter)getsrv_recmbr, NULL, "limit on number of request header fields", "limit_req_fields"},
+ {NULL} /* Sentinel */
+};
+
+
+/**
+ ** server_dealloc
+ **
+ *
+ */
+
+static void server_dealloc(serverobject *self)
+{
+ Py_XDECREF(self->dict);
+ Py_XDECREF(self->next);
+ free(self);
}
+static char server_doc[] =
+"Apache server_rec structure\n";
+
PyTypeObject MpServer_Type = {
PyObject_HEAD_INIT(NULL)
0,
@@ -281,7 +328,7 @@
0,
(destructor) server_dealloc, /*tp_dealloc*/
0, /*tp_print*/
- (getattrfunc) server_getattr, /*tp_getattr*/
+ 0, /*tp_getattr*/
0, /*tp_setattr*/
0, /*tp_compare*/
0, /*tp_repr*/
@@ -289,7 +336,34 @@
0, /*tp_as_sequence*/
0, /*tp_as_mapping*/
0, /*tp_hash*/
+ 0, /* tp_call */
+ 0, /* tp_str */
+ PyObject_GenericGetAttr, /* tp_getattro */
+ PyObject_GenericSetAttr, /* tp_setattro */
+ 0, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT |
+ Py_TPFLAGS_BASETYPE, /* tp_flags */
+ server_doc, /* tp_doc */
+ 0, /* tp_traverse */
+ 0, /* tp_clear */
+ 0, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ 0, /* tp_iter */
+ 0, /* tp_iternext */
+ server_methods, /* tp_methods */
+ 0, /* tp_members */
+ server_getsets, /* tp_getset */
+ 0, /* tp_base */
+ 0, /* tp_dict */
+ 0, /* tp_descr_get */
+ 0, /* tp_descr_set */
+ offsetof(serverobject, dict), /* tp_dictoffset */
+ 0, /* tp_init */
+ 0, /* tp_alloc */
+ 0, /* tp_new */
+ (destructor)server_dealloc, /* tp_free */
};
+
1.5 +2 -1 httpd-python/src/include/serverobject.h
Index: serverobject.h
===================================================================
RCS file: /home/cvs/httpd-python/src/include/serverobject.h,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- serverobject.h 8 Nov 2002 00:15:11 -0000 1.4
+++ serverobject.h 12 Jul 2003 03:44:53 -0000 1.5
@@ -69,6 +69,7 @@
typedef struct serverobject {
PyObject_HEAD
+ PyObject *dict;
server_rec *server;
PyObject *next;
} serverobject;