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;