def makeRequest(self, request): """Connect to the remote HTTP server and send request""" self.tcpclient = None self.httpparser = None port = intval(request.requestobject.get("uri-port", "")) if port == None: port = 80 self.tcpclient = self.connectionclass( request.requestobject["uri-server"], port) self.httpparser = HTTPParser(mode="response") self.link((self, "_tcpoutbox"), (self.tcpclient, "inbox")) self.link((self, "_tcpsignal"), (self.tcpclient, "control")) self.link((self.tcpclient, "signal"), (self, "_tcpcontrol")) self.link((self.tcpclient, "outbox"), (self.httpparser, "inbox")) #incoming TCP data -> HTTPParser directly self.link((self, "_parsersignal"), (self.httpparser, "control")) self.link((self.httpparser, "outbox"), (self, "_parserinbox")) self.link((self.httpparser, "signal"), (self, "_parsercontrol")) self.addChildren(self.tcpclient, self.httpparser) self.tcpclient.activate() self.httpparser.activate() self.response = "" if isinstance(request.requestobject["request"], str): self.send(request.requestobject["request"], "_tcpoutbox") else: for part in request.requestobject["request"]: self.send(part, "_tcpoutbox")
def HTTPServer(createRequestHandler, **argd): """\ HTTPServer() -> new HTTPServer component capable of handling a single connection Arguments: -- createRequestHandler - a function required by HTTPRequestHandler that creates the appropriate request-handler component for each request, see HTTPResourceGlue """ return Graphline( PARSER=HTTPParser(**argd), # Since this is where the data goes first! HANDLER=HTTPRequestHandler(createRequestHandler), CORELOGIC=HTTPShutdownLogicHandling(), linkages={ # Data Handling ("self", "inbox"): ("PARSER", "inbox"), ("PARSER", "outbox"): ("HANDLER", "inbox"), ("HANDLER", "outbox"): ("self", "outbox"), # Signalling Handling ("self", "control"): ("CORELOGIC", "control"), ("CORELOGIC", "Psignal"): ("PARSER", "control"), ("CORELOGIC", "Hsignal"): ("HANDLER", "control"), ("CORELOGIC", "signal"): ("self", "signal"), ("PARSER", "signal"): ("CORELOGIC", "Pcontrol"), ("HANDLER", "signal"): ("CORELOGIC", "Hcontrol"), })