#ifndef Mp_MOD_PYTHON_H
#define Mp_MOD_PYTHON_H
/*
* Copyright (C) 2000, 2001, 2013, 2024 Gregory Trubetskoy
* Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007 Apache Software Foundation
*
* Licensed under the Apache License, Version 2.0 (the "License"); you
* may not use this file except in compliance with the License. You
* may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
* implied. See the License for the specific language governing
* permissions and limitations under the License.
*
* Originally developed by Gregory Trubetskoy.
*
*
* mod_python.h
*
* See accompanying documentation and source code comments
* for details.
*
*/
/*
*
*
* DO NOT EDIT - DO NOT EDIT - DO NOT EDIT - DO NOT EDIT
*
*
*
* If you are looking at mod_python.h, it is an auto-generated file on
* UNIX. This file is kept around for the Win32 platform which
* does not use autoconf. Any changes to mod_python.h must also be
* reflected in mod_python.h.in.
*/
/* Python headers */
#define PY_SSIZE_T_CLEAN
#include "Python.h"
#include "structmember.h"
/* Apache headers */
#include "httpd.h"
#define CORE_PRIVATE
#include "http_config.h"
#include "http_core.h"
#include "http_main.h"
#include "http_connection.h"
#include "http_protocol.h"
#include "http_request.h"
#include "util_script.h"
#include "util_filter.h"
#include "http_log.h"
#include "apr_strings.h"
#include "apr_lib.h"
#include "apr_hash.h"
#include "apr_fnmatch.h"
#include "scoreboard.h"
#include "ap_mpm.h"
#include "ap_mmn.h"
#include "mod_include.h"
#if !defined(OS2) && !defined(WIN32) && !defined(BEOS) && !defined(NETWARE)
#include "unixd.h"
#endif
#if !AP_MODULE_MAGIC_AT_LEAST(20050127,0)
/* Debian backported ap_regex_t to Apache 2.0 and
* thus made official version checking break. */
#ifndef AP_REG_EXTENDED
typedef regex_t ap_regex_t;
#define AP_REG_EXTENDED REG_EXTENDED
#define AP_REG_ICASE REG_ICASE
#endif
#endif
#if defined(WIN32) && !defined(WITH_THREAD)
#error Python threading must be enabled on Windows
#endif
#if !defined(WIN32)
#include
#endif
/* pool given to us in ChildInit. We use it for
server.register_cleanup() */
extern apr_pool_t *child_init_pool;
/* Apache module declaration */
extern module AP_MODULE_DECLARE_DATA python_module;
#include "util.h"
#include "hlist.h"
#include "hlistobject.h"
#include "tableobject.h"
#include "serverobject.h"
#include "connobject.h"
#include "_apachemodule.h"
#include "requestobject.h"
#include "filterobject.h"
#include "finfoobject.h"
/** Things specific to mod_python, as an Apache module **/
#if PY_MAJOR_VERSION < 3
#define PyBytesObject PyStringObject
#define PyBytes_Check PyString_Check
#define PyBytes_CheckExact PyString_CheckExact
#define PyBytes_FromString PyString_FromString
#define PyBytes_FromStringAndSize PyString_FromStringAndSize
#define PyBytes_AS_STRING PyString_AS_STRING
#define PyBytes_ConcatAndDel PyString_ConcatAndDel
#define PyBytes_Size PyString_Size
#define _PyBytes_Resize _PyString_Resize
#define MpObject_ReprAsBytes PyObject_Repr
#define MpBytesOrUnicode_FromString PyString_FromString
#ifndef PyVarObject_HEAD_INIT
#define PyVarObject_HEAD_INIT(type, size) \
PyObject_HEAD_INIT(type) size,
#endif
#ifndef Py_TYPE
#define Py_TYPE(ob) (((PyObject*)(ob))->ob_type)
#endif
#else
#define MpBytesOrUnicode_FromString PyUnicode_FromString
#endif /* PY_MAJOR_VERSION < 3 */
#define MP_CONFIG_KEY "mod_python_config"
#define MAIN_INTERPRETER "main_interpreter"
#define FILTER_NAME "MOD_PYTHON"
/* used in python_directive_handler */
#define SILENT 1
#define NOTSILENT 0
/* MAX_LOCKS can now be set as a configure option
* ./configure --with-max-locks=INTEGER
*/
#define MAX_LOCKS 8
/* MUTEX_DIR can be set as a configure option
* ./configure --with-mutex-dir=/path/to/dir
*/
#define MUTEX_DIR "/tmp"
/* version stuff */
extern const int mp_version_major;
extern const int mp_version_minor;
extern const int mp_version_patch;
extern const char * const mp_version_string;
extern const char * const mp_version_component;
/* structure to hold interpreter data */
typedef struct {
apr_array_header_t * tstates; /* tstates available for use */
PyInterpreterState *interp;
PyObject *obcallback;
} interpreterdata;
/* global configuration parameters */
typedef struct
{
apr_global_mutex_t **g_locks;
int nlocks;
int parent_pid;
} py_global_config;
/* structure describing per directory configuration parameters */
typedef struct {
int authoritative;
char *config_dir;
char d_is_location;
apr_table_t *directives;
apr_table_t *options;
apr_hash_t *hlists; /* hlists for every phase */
apr_hash_t *in_filters;
apr_hash_t *out_filters;
apr_table_t *imports; /* for PythonImport */
} py_config;
/* register_cleanup info */
typedef struct
{
request_rec *request_rec;
server_rec *server_rec;
PyObject *handler;
const char *interpreter;
PyObject *data;
} cleanup_info;
/* request config structure */
typedef struct
{
requestobject *request_obj;
apr_hash_t *dynhls; /* dynamically registered handlers
for this request */
apr_hash_t *in_filters; /* dynamically registered input filters
for this request */
apr_hash_t *out_filters; /* dynamically registered output filters
for this request */
} py_req_config;
/* filter context */
typedef struct
{
char *name;
int transparent;
} python_filter_ctx;
/* a structure to hold a handler,
used in configuration for filters */
typedef struct
{
char *handler;
char *directory;
unsigned d_is_fnmatch : 1;
unsigned d_is_location : 1;
ap_regex_t *regex;
} py_handler;
apr_status_t python_cleanup(void *data);
PyObject* python_interpreter_name(void);
requestobject *python_get_request_object(request_rec *req, const char *phase);
PyObject *_apache_module_init();
APR_DECLARE_OPTIONAL_FN(PyInterpreterState *, mp_acquire_interpreter, (const char *));
APR_DECLARE_OPTIONAL_FN(void, mp_release_interpreter, ());
APR_DECLARE_OPTIONAL_FN(PyObject *, mp_get_request_object, (request_rec *));
APR_DECLARE_OPTIONAL_FN(PyObject *, mp_get_server_object, (server_rec *));
APR_DECLARE_OPTIONAL_FN(PyObject *, mp_get_connection_object, (conn_rec *));
/* This macro assigns a C string representation of PyObject *obj to
* char *str. obj must be a Unicode Latin1 or Bytes. It will try its
* best to accomplish this with zero-copy. WARNING - it DECREFs
* (unless obj_is_borrowed) and changes the value of obj when it is
* unicode that must be recoded, so do not use obj afterwards other
* than to DECREF it - it may not be what you expected. You MUST
* Py_DECREF(obj) afterward (even if error), but not before you're
* done with the value of str. Note that if the obj reference was
* borrowed, and without the macro you wouldn't be DECREFing it, you
* should indicate that by setting obj_is_borrowed to 1 and DECREF
* it. If after this macro str is NULL, then a TypeError error has
* been set by the macro.
*/
#if PY_MAJOR_VERSION < 3
#define PyUnicode_1BYTE_KIND NULL
#define PyUnicode_KIND(str) NULL
#define PyUnicode_1BYTE_DATA(obj) ""
#endif
#define MP_ANYSTR_AS_STR(str, obj, obj_is_borrowed) do { \
str = NULL; \
if (PyUnicode_CheckExact(obj)) { \
if (PY_MAJOR_VERSION >= 3 && PY_MINOR_VERSION >= 3 && \
PyUnicode_KIND(obj) == PyUnicode_1BYTE_KIND) { \
if (obj_is_borrowed) Py_INCREF(obj); /* so DECREF ok */ \
str = PyUnicode_1BYTE_DATA(obj); \
} else { \
PyObject *latin = PyUnicode_AsLatin1String(obj); \
if (latin) { \
str = PyBytes_AsString(latin); /* #define on 2.6 */ \
if (!obj_is_borrowed) Py_DECREF(obj); \
obj = latin; /* remember to DECREF me! */ \
} \
} \
} else if (PyBytes_CheckExact(obj)) { /* #define on 2.6 */ \
str = PyBytes_AsString(obj); /* #define on 2.6 */ \
if (obj_is_borrowed) Py_INCREF(obj); /* so DECREF ok */ \
} \
if (!str) { \
if (obj_is_borrowed) Py_INCREF(obj); /* so DECREF ok */ \
PyErr_SetString(PyExc_TypeError, \
"not an ISO-8859-1 string"); \
} \
} while (0)
#ifndef MpObject_ReprAsBytes
static inline PyObject *MpObject_ReprAsBytes(PyObject *o) {
PyObject *result;
PyObject *ucode = PyObject_Repr(o);
/* we can do this because repr() should never have non-ascii characters XXX (really?) */
char *c = PyUnicode_1BYTE_DATA(ucode);
if (c[0] == 'b')
result = PyBytes_FromStringAndSize(PyUnicode_1BYTE_DATA(ucode)+1, PyUnicode_GET_LENGTH(ucode)-1);
else
result = PyBytes_FromStringAndSize(PyUnicode_1BYTE_DATA(ucode), PyUnicode_GET_LENGTH(ucode));
Py_DECREF(ucode);
return result;
}
#endif
#endif /* !Mp_MOD_PYTHON_H */
/*
# makes emacs go into C mode
### Local Variables:
### mode:c
### End:
*/