📄 apache.py
字号:
# carve out the piece, then shorten the buffer result = self.buf[:i+1] self.buf = self.buf[i+1:] self.pos = self.pos + len(result) return resultclass CGIStdout(NullIO): """ Class that allows writing to the socket directly for CGI. """ def __init__(self, req): self.pos = 0 self.req = req self.headers_sent = 0 self.headers = "" def write(self, s): if not s: return if not self.headers_sent: self.headers = self.headers + s # are headers over yet? headers_over = 0 # first try RFC-compliant CRLF ss = self.headers.split('\r\n\r\n', 1) if len(ss) < 2: # second try with \n\n ss = self.headers.split('\n\n', 1) if len(ss) >= 2: headers_over = 1 else: headers_over = 1 if headers_over: # headers done, process them ss[0] = ss[0].replace('\r\n', '\n') lines = ss[0].split('\n') for line in lines: h, v = line.split(":", 1) v = v.strip() if h.lower() == "status": status = int(v.split()[0]) self.req.status = status elif h.lower() == "content-type": self.req.content_type = v self.req.headers_out[h] = v else: self.req.headers_out.add(h, v) self.headers_sent = 1 # write the body if any at this point self.req.write(ss[1]) else: self.req.write(str(s)) self.pos = self.pos + len(s) def tell(self): return self.posdef setup_cgi(req): """ Replace sys.stdin and stdout with an objects that read/write to the socket, as well as substitute the os.environ. Returns (environ, stdin, stdout) which you must save and then use with restore_nocgi(). """ # save env save_env = os.environ.copy() si = sys.stdin so = sys.stdout os.environ.update(build_cgi_env(req)) sys.stdout = CGIStdout(req) sys.stdin = CGIStdin(req) sys.argv = [] # keeps cgi.py happy return save_env, si, sodef restore_nocgi(sav_env, si, so): """ see setup_cgi() """ osenv = os.environ # restore env for k in osenv.keys(): del osenv[k] for k in sav_env: osenv[k] = sav_env[k] sys.stdout = si sys.stdin = sointerpreter = Nonemain_server = None_callback = Nonedef register_cleanup(callback, data=None): _apache.register_cleanup(interpreter, main_server, callback, data)def init(name, server): """ This function is called by the server at startup time """ global interpreter global main_server interpreter = name main_server = server sys.argv = ["mod_python"] global _callback _callback = CallBack() options = main_server.get_options() #interpreters = options.get('mod_python.future.importer', None) interpreters = options.get('mod_python.legacy.importer', None) if interpreters: interpreters = map(lambda x: x.strip(), interpreters.split(',')) #if '*' in interpreters or interpreter in interpreters: if not ('*' in interpreters or interpreter in interpreters): from mod_python import importer else: from mod_python import importer return _callback## Some functions made publicmake_table = _apache.tablelog_error = _apache.log_errortable = _apache.tableconfig_tree = _apache.config_treeserver_root = _apache.server_rootmpm_query = _apache.mpm_queryexists_config_define = _apache.exists_config_definestat = _apache.stat## Some constantsHTTP_CONTINUE = 100HTTP_SWITCHING_PROTOCOLS = 101HTTP_PROCESSING = 102HTTP_OK = 200HTTP_CREATED = 201HTTP_ACCEPTED = 202HTTP_NON_AUTHORITATIVE = 203HTTP_NO_CONTENT = 204HTTP_RESET_CONTENT = 205HTTP_PARTIAL_CONTENT = 206HTTP_MULTI_STATUS = 207HTTP_MULTIPLE_CHOICES = 300HTTP_MOVED_PERMANENTLY = 301HTTP_MOVED_TEMPORARILY = 302HTTP_SEE_OTHER = 303HTTP_NOT_MODIFIED = 304HTTP_USE_PROXY = 305HTTP_TEMPORARY_REDIRECT = 307HTTP_BAD_REQUEST = 400HTTP_UNAUTHORIZED = 401HTTP_PAYMENT_REQUIRED = 402HTTP_FORBIDDEN = 403HTTP_NOT_FOUND = 404HTTP_METHOD_NOT_ALLOWED = 405HTTP_NOT_ACCEPTABLE = 406HTTP_PROXY_AUTHENTICATION_REQUIRED= 407HTTP_REQUEST_TIME_OUT = 408HTTP_CONFLICT = 409HTTP_GONE = 410HTTP_LENGTH_REQUIRED = 411HTTP_PRECONDITION_FAILED = 412HTTP_REQUEST_ENTITY_TOO_LARGE = 413HTTP_REQUEST_URI_TOO_LARGE = 414HTTP_UNSUPPORTED_MEDIA_TYPE = 415HTTP_RANGE_NOT_SATISFIABLE = 416HTTP_EXPECTATION_FAILED = 417HTTP_UNPROCESSABLE_ENTITY = 422HTTP_LOCKED = 423HTTP_FAILED_DEPENDENCY = 424HTTP_UPGRADE_REQUIRED = 426HTTP_INTERNAL_SERVER_ERROR = 500HTTP_NOT_IMPLEMENTED = 501HTTP_BAD_GATEWAY = 502HTTP_SERVICE_UNAVAILABLE = 503HTTP_GATEWAY_TIME_OUT = 504HTTP_VERSION_NOT_SUPPORTED = 505HTTP_VARIANT_ALSO_VARIES = 506HTTP_INSUFFICIENT_STORAGE = 507HTTP_NOT_EXTENDED = 510# The APLOG constants in Apache are derived from syslog.h# constants, so we do same here.try: import syslog APLOG_EMERG = syslog.LOG_EMERG # system is unusable APLOG_ALERT = syslog.LOG_ALERT # action must be taken immediately APLOG_CRIT = syslog.LOG_CRIT # critical conditions APLOG_ERR = syslog.LOG_ERR # error conditions APLOG_WARNING = syslog.LOG_WARNING # warning conditions APLOG_NOTICE = syslog.LOG_NOTICE # normal but significant condition APLOG_INFO = syslog.LOG_INFO # informational APLOG_DEBUG = syslog.LOG_DEBUG # debug-level messagesexcept ImportError: APLOG_EMERG = 0 APLOG_ALERT = 1 APLOG_CRIT = 2 APLOG_ERR = 3 APLOG_WARNING = 4 APLOG_NOTICE = 5 APLOG_INFO = 6 APLOG_DEBUG = 7APLOG_NOERRNO = 8OK = REQ_PROCEED = 0DONE = -2DECLINED = REQ_NOACTION = -1_status_values = { "postreadrequesthandler": [ DECLINED, OK ], "transhandler": [ DECLINED ], "maptostoragehandler": [ DECLINED ], "inithandler": [ DECLINED, OK ], "headerparserhandler": [ DECLINED, OK ], "accesshandler": [ DECLINED, OK ], "authenhandler": [ DECLINED ], "authzhandler": [ DECLINED ], "typehandler": [ DECLINED ], "fixuphandler": [ DECLINED, OK ], "loghandler": [ DECLINED, OK ], "handler": [ OK ],}# constants for get_remote_hostREMOTE_HOST = 0REMOTE_NAME = 1REMOTE_NOLOOKUP = 2REMOTE_DOUBLE_REV = 3# legacy/mod_python thingsREQ_ABORTED = HTTP_INTERNAL_SERVER_ERRORREQ_EXIT = "REQ_EXIT"SERVER_RETURN = _apache.SERVER_RETURNPROG_TRACEBACK = "PROG_TRACEBACK"# the req.finfo tupleFINFO_MODE = 0FINFO_INO = 1FINFO_DEV = 2FINFO_NLINK = 3FINFO_UID = 4FINFO_GID = 5FINFO_SIZE = 6FINFO_ATIME = 7FINFO_MTIME = 8FINFO_CTIME = 9FINFO_FNAME = 10FINFO_NAME = 11FINFO_FILETYPE = 12# the req.parsed_uriURI_SCHEME = 0URI_HOSTINFO = 1URI_USER = 2URI_PASSWORD = 3URI_HOSTNAME = 4URI_PORT = 5URI_PATH = 6URI_QUERY = 7URI_FRAGMENT = 8# for req.proxyreqPROXYREQ_NONE = 0 # No proxyPROXYREQ_PROXY = 1 # Standard proxyPROXYREQ_REVERSE = 2 # Reverse proxyPROXYREQ_RESPONSE = 3 # Origin response# methods for req.allow_method()M_GET = 0 # RFC 2616: HTTPM_PUT = 1M_POST = 2M_DELETE = 3M_CONNECT = 4M_OPTIONS = 5M_TRACE = 6 # RFC 2616: HTTPM_PATCH = 7M_PROPFIND = 8 # RFC 2518: WebDAVM_PROPPATCH = 9M_MKCOL = 10M_COPY = 11M_MOVE = 12M_LOCK = 13M_UNLOCK = 14 # RFC2518: WebDAVM_VERSION_CONTROL = 15 # RFC3253: WebDAV VersioningM_CHECKOUT = 16M_UNCHECKOUT = 17M_CHECKIN = 18M_UPDATE = 19M_LABEL = 20M_REPORT = 21M_MKWORKSPACE = 22M_MKACTIVITY = 23M_BASELINE_CONTROL = 24M_MERGE = 25M_INVALID = 26 # RFC3253: WebDAV Versioning# for req.used_path_infoAP_REQ_ACCEPT_PATH_INFO = 0 # Accept request given path_infoAP_REQ_REJECT_PATH_INFO = 1 # Send 404 error if path_info was givenAP_REQ_DEFAULT_PATH_INFO = 2 # Module's choice for handling path_info# for mpm_queryAP_MPMQ_NOT_SUPPORTED = 0 # This value specifies whether # an MPM is capable of # threading or forking.AP_MPMQ_STATIC = 1 # This value specifies whether # an MPM is using a static # of # threads or daemons.AP_MPMQ_DYNAMIC = 2 # This value specifies whether # an MPM is using a dynamic # of # threads or daemons.AP_MPMQ_MAX_DAEMON_USED = 1 # Max # of daemons used so farAP_MPMQ_IS_THREADED = 2 # MPM can do threadingAP_MPMQ_IS_FORKED = 3 # MPM can do forkingAP_MPMQ_HARD_LIMIT_DAEMONS = 4 # The compiled max # daemonsAP_MPMQ_HARD_LIMIT_THREADS = 5 # The compiled max # threadsAP_MPMQ_MAX_THREADS = 6 # # of threads/child by configAP_MPMQ_MIN_SPARE_DAEMONS = 7 # Min # of spare daemonsAP_MPMQ_MIN_SPARE_THREADS = 8 # Min # of spare threadsAP_MPMQ_MAX_SPARE_DAEMONS = 9 # Max # of spare daemonsAP_MPMQ_MAX_SPARE_THREADS = 10 # Max # of spare threadsAP_MPMQ_MAX_REQUESTS_DAEMON= 11 # Max # of requests per daemonAP_MPMQ_MAX_DAEMONS = 12 # Max # of daemons by config# magic mime typesCGI_MAGIC_TYPE = "application/x-httpd-cgi" INCLUDES_MAGIC_TYPE = "text/x-server-parsed-html" INCLUDES_MAGIC_TYPE3 = "text/x-server-parsed-html3" DIR_MAGIC_TYPE = "httpd/unix-directory" # for req.read_bodyREQUEST_NO_BODY = 0 REQUEST_CHUNKED_ERROR = 1 REQUEST_CHUNKED_DECHUNK = 2 # for req.connection.keepaliveAP_CONN_UNKNOWN = _apache.AP_CONN_UNKNOWNAP_CONN_CLOSE = _apache.AP_CONN_CLOSEAP_CONN_KEEPALIVE = _apache.AP_CONN_KEEPALIVE# for req.finfo[apache.FINFO_FILETYPE]APR_NOFILE = _apache.APR_NOFILEAPR_REG = _apache.APR_REGAPR_DIR = _apache.APR_DIRAPR_CHR = _apache.APR_CHRAPR_BLK = _apache.APR_BLKAPR_PIPE = _apache.APR_PIPEAPR_LNK = _apache.APR_LNKAPR_SOCK = _apache.APR_SOCKAPR_UNKFILE = _apache.APR_UNKFILE# for apache.stat()APR_FINFO_LINK = 0x00000001 # Stat the link not the file itself if it is a linkAPR_FINFO_MTIME = 0x00000010 # Modification TimeAPR_FINFO_CTIME = 0x00000020 # Creation or inode-changed timeAPR_FINFO_ATIME = 0x00000040 # Access TimeAPR_FINFO_SIZE = 0x00000100 # Size of the fileAPR_FINFO_CSIZE = 0x00000200 # Storage size consumed by the fileAPR_FINFO_DEV = 0x00001000 # DeviceAPR_FINFO_INODE = 0x00002000 # InodeAPR_FINFO_NLINK = 0x00004000 # Number of linksAPR_FINFO_TYPE = 0x00008000 # TypeAPR_FINFO_USER = 0x00010000 # UserAPR_FINFO_GROUP = 0x00020000 # GroupAPR_FINFO_UPROT = 0x00100000 # User protection bitsAPR_FINFO_GPROT = 0x00200000 # Group protection bitsAPR_FINFO_WPROT = 0x00400000 # World protection bitsAPR_FINFO_ICASE = 0x01000000 # if dev is case insensitiveAPR_FINFO_NAME = 0x02000000 # ->name in proper caseAPR_FINFO_MIN = 0x00008170 # type, mtime, ctime, atime, sizeAPR_FINFO_IDENT = 0x00003000 # dev and inodeAPR_FINFO_OWNER = 0x00030000 # user and groupAPR_FINFO_PROT = 0x00700000 # all protectionsAPR_FINFO_NORM = 0x0073b170 # an atomic unix apr_stat()APR_FINFO_DIRENT = 0x02000000 # an atomic unix apr_dir_read()
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -