home *** CD-ROM | disk | FTP | other *** search
- # Source Generated with Decompyle++
- # File: in.pyc (Python 2.6)
-
- import sys
- from isapi import isapicon, ExtensionError
- import isapi.simple as isapi
- from win32file import GetQueuedCompletionStatus, CreateIoCompletionPort, PostQueuedCompletionStatus, CloseHandle
- from win32security import SetThreadToken
- from win32event import INFINITE
- from pywintypes import OVERLAPPED
- if sys.hexversion < 33816576:
- import locale
- locale.setlocale(locale.LC_NUMERIC, 'C')
-
- import threading
- import traceback
- ISAPI_REQUEST = 1
- ISAPI_SHUTDOWN = 2
-
- class WorkerThread(threading.Thread):
-
- def __init__(self, extension, io_req_port):
- self.running = False
- self.io_req_port = io_req_port
- self.extension = extension
- threading.Thread.__init__(self)
-
-
- def run(self):
- self.running = True
- while self.running:
- (errCode, bytes, key, overlapped) = GetQueuedCompletionStatus(self.io_req_port, INFINITE)
- if key == ISAPI_SHUTDOWN and overlapped is None:
- break
-
- dispatcher = self.extension.dispatch_map.get(key)
- if dispatcher is None:
- raise RuntimeError, "Bad request '%s'" % (key,)
- dispatcher is None
- dispatcher(errCode, bytes, key, overlapped)
-
-
- def call_handler(self, cblock):
- self.extension.Dispatch(cblock)
-
-
-
- class ThreadPoolExtension(isapi.simple.SimpleExtension):
- max_workers = 20
- worker_shutdown_wait = 15000
-
- def __init__(self):
- self.workers = []
- self.dispatch_map = {
- ISAPI_REQUEST: self.DispatchConnection }
-
-
- def GetExtensionVersion(self, vi):
- isapi.simple.SimpleExtension.GetExtensionVersion(self, vi)
- self.io_req_port = CreateIoCompletionPort(-1, None, 0, 0)
- self.workers = []
- for i in range(self.max_workers):
- worker = WorkerThread(self, self.io_req_port)
- worker.start()
- self.workers.append(worker)
-
-
-
- def HttpExtensionProc(self, control_block):
- overlapped = OVERLAPPED()
- overlapped.object = control_block
- PostQueuedCompletionStatus(self.io_req_port, 0, ISAPI_REQUEST, overlapped)
- return isapicon.HSE_STATUS_PENDING
-
-
- def TerminateExtension(self, status):
- for worker in self.workers:
- worker.running = False
-
- for worker in self.workers:
- PostQueuedCompletionStatus(self.io_req_port, 0, ISAPI_SHUTDOWN, None)
-
- for worker in self.workers:
- worker.join(self.worker_shutdown_wait)
-
- self.dispatch_map = { }
- CloseHandle(self.io_req_port)
-
-
- def DispatchConnection(self, errCode, bytes, key, overlapped):
- control_block = overlapped.object
- hRequestToken = control_block.GetImpersonationToken()
- SetThreadToken(None, hRequestToken)
-
- try:
- self.Dispatch(control_block)
- except:
- self.HandleDispatchError(control_block)
- finally:
- SetThreadToken(None, None)
-
-
-
- def Dispatch(self, ecb):
- raise NotImplementedError, 'sub-classes should override Dispatch'
-
-
- def HandleDispatchError(self, ecb):
- ecb.HttpStatusCode = isapicon.HSE_STATUS_ERROR
- (exc_typ, exc_val, exc_tb) = sys.exc_info()
- limit = None
-
- try:
- import cgi
- ecb.SendResponseHeaders('200 OK', 'Content-type: text/html\r\n\r\n', False)
- print >>ecb
- print >>ecb, '<H3>Traceback (most recent call last):</H3>'
- list = traceback.format_tb(exc_tb, limit) + traceback.format_exception_only(exc_typ, exc_val)
- print >>ecb, '<PRE>%s<B>%s</B></PRE>' % (cgi.escape(''.join(list[:-1])), cgi.escape(list[-1]))
- except ExtensionError:
- pass
- except:
- print 'FAILED to render the error message!'
- traceback.print_exc()
- print 'ORIGINAL extension error:'
- traceback.print_exception(exc_typ, exc_val, exc_tb)
- finally:
- exc_tb = None
- ecb.DoneWithSession()
-
-
-
-