summaryrefslogtreecommitdiff
path: root/modules/modpy/interface.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'modules/modpy/interface.cpp')
-rw-r--r--modules/modpy/interface.cpp160
1 files changed, 160 insertions, 0 deletions
diff --git a/modules/modpy/interface.cpp b/modules/modpy/interface.cpp
new file mode 100644
index 0000000..948fa5c
--- /dev/null
+++ b/modules/modpy/interface.cpp
@@ -0,0 +1,160 @@
+/*
+ * bitz-server, An ICAP server implementation in C++
+ * Copyright (C) 2012 Uditha Atukorala
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#include "interface.h"
+
+#include <bitz/logger.h>
+#include <icap/request.h>
+#include <icap/response.h>
+#include <iostream>
+
+
+PyObject * bitz_get_request( PyObject * self, PyObject * pyrequest ) {
+
+ PyObject * pyreturn;
+ PyObject * pypayload;
+ icap::Request * request;
+
+ // logger
+ bitz::Logger &logger = bitz::Logger::instance();
+ logger.debug( "[modpy.interface] get_request()" );
+
+ // initialise return dictionary
+ pyreturn = PyDict_New();
+
+ // grab the request object pointer from args
+ void * p = PyCapsule_GetPointer( pyrequest, "request" );
+
+ // sanity check
+ if ( p != NULL ) {
+
+ // construct the request
+ request = static_cast<icap::Request *>(p);
+
+ PyDict_SetItemString( pyreturn, "request", PyString_FromString( request->header()->method().c_str() ) );
+ PyDict_SetItemString( pyreturn, "uri", PyString_FromString( request->header()->uri().c_str() ) );
+ PyDict_SetItemString( pyreturn, "protocol", PyString_FromString( request->header()->protocol().c_str() ) );
+
+ // payload dictionary
+ pypayload = PyDict_New();
+ PyDict_SetItemString( pypayload, "req_header", PyString_FromStringAndSize( request->payload().req_header.c_str(), request->payload().req_header.size() ) );
+ PyDict_SetItemString( pypayload, "req_body", PyString_FromStringAndSize( request->payload().req_body.c_str(), request->payload().req_body.size() ) );
+ PyDict_SetItemString( pypayload, "res_header", PyString_FromStringAndSize( request->payload().res_header.c_str(), request->payload().res_header.size() ) );
+ PyDict_SetItemString( pypayload, "res_body", PyString_FromStringAndSize( request->payload().res_body.c_str(), request->payload().res_body.size() ) );
+ PyDict_SetItemString( pypayload, "ieof", PyBool_FromLong( request->payload().ieof ) );
+
+ PyDict_SetItemString( pyreturn, "payload", pypayload );
+
+ // cleanup
+ Py_DECREF( pypayload );
+
+ } else {
+ logger.warn( "[modpy.interface] failed to get request object pointer" );
+ }
+
+ return pyreturn;
+
+}
+
+
+PyObject * bitz_get_response_from_status( PyObject * self, PyObject * args ) {
+
+ PyObject * pyresponse;
+ icap::Response * response;
+
+ unsigned int resp_status;
+
+ // logger
+ bitz::Logger &logger = bitz::Logger::instance();
+ logger.debug( "[modpy.interface] get_response_from_status()" );
+
+ // parse args
+ if ( PyArg_ParseTuple( args, "I", &resp_status ) ) {
+ response = new icap::Response( (icap::ResponseHeader::status_t) resp_status );
+ } else {
+ logger.warn( "[modpy.interface] failed to parse arguments" );
+ response = new icap::Response( icap::ResponseHeader::SERVER_ERROR );
+ }
+
+ // convert the response into a capsule
+ pyresponse = PyCapsule_New( (void *) response, "response", NULL );
+
+ return pyresponse;
+
+}
+
+
+PyObject * bitz_get_response( PyObject * self, PyObject * args ) {
+
+ PyObject * pyresponse;
+ PyObject * pypayload;
+ icap::Response * response = NULL;
+
+ unsigned int resp_status;
+ icap::payload_t payload;
+
+ // vars to ferry across strings from python dictionary to c++
+ char * pybuffer;
+ Py_ssize_t pybuflen;
+
+
+ // logger
+ bitz::Logger &logger = bitz::Logger::instance();
+ logger.debug( "[modpy.interface] get_response()" );
+
+ // parse args
+ if ( PyArg_ParseTuple( args, "IO!", &resp_status, &PyDict_Type, &pypayload ) ) {
+
+ // copy strings from python dictionary
+ PyString_AsStringAndSize( PyDict_GetItemString( pypayload, "req_header" ), &pybuffer, &pybuflen );
+ payload.req_header.assign( pybuffer, pybuflen );
+
+ PyString_AsStringAndSize( PyDict_GetItemString( pypayload, "req_body" ), &pybuffer, &pybuflen );
+ payload.req_body.assign( pybuffer, pybuflen );
+
+ PyString_AsStringAndSize( PyDict_GetItemString( pypayload, "res_header" ), &pybuffer, &pybuflen );
+ payload.res_header.assign( pybuffer, pybuflen );
+
+ PyString_AsStringAndSize( PyDict_GetItemString( pypayload, "res_body" ), &pybuffer, &pybuflen );
+ payload.res_body.assign( pybuffer, pybuflen );
+
+ // copy other data types from python dictionary
+ payload.ieof = PyBool_Check( PyDict_GetItemString( pypayload, "ieof" ) );
+
+ // construct the response object
+ response = new icap::Response( (icap::ResponseHeader::status_t) resp_status );
+ response->payload( payload );
+
+ } else {
+ logger.warn( "[modpy.interface] failed to parse arguments" );
+ }
+
+ // sanity check
+ if ( response == NULL ) {
+ response = new icap::Response( icap::ResponseHeader::SERVER_ERROR );
+ }
+
+ // convert the response into a capsule
+ pyresponse = PyCapsule_New( (void *) response, "response", NULL );
+
+ return pyresponse;
+
+}
+
+