source: server/lib/gutenbach/server/server.py @ ef8df33

no-cups
Last change on this file since ef8df33 was ef8df33, checked in by Jessica B. Hamrick <jhamrick@…>, 12 years ago

Move more ipp-specific code into ipp/operations from server/requests; Fix more bugs

  • Property mode set to 100644
File size: 2.3 KB
RevLine 
[7bd1035]1from gutenbach.server.requests import GutenbachRequestHandler
[738d179]2import BaseHTTPServer
[7bd1035]3import gutenbach.ipp as ipp
[738d179]4import logging
5import traceback
[dc40fe9]6import sys
[7bd1035]7
8# initialize logger
9logger = logging.getLogger(__name__)
10
11class GutenbachIPPServer(BaseHTTPServer.BaseHTTPRequestHandler):
12    def setup(self):
13        self.root = GutenbachRequestHandler()
14        BaseHTTPServer.BaseHTTPRequestHandler.setup(self)
15
16    def handle_one_request(self):
17        self.raw_requestline = self.rfile.readline()
18        if not self.raw_requestline:
19            self.close_connection = 1
20            return
21        if not self.parse_request(): # An error code has been sent, just exit
22            return
23        self.handle_ipp()
24
25    def handle_ipp(self):
26        # Receive a request
27        length = int(self.headers.getheader('content-length', 0))
28        request = ipp.Request(request=self.rfile, length=length)
29        logger.debug("Received request: %s" % repr(request))
30
[dc40fe9]31        # Get the handler and pass it the request and response
32        # objects.  It will fill in values for the response object or
33        # thrown an error.
[7bd1035]34        try:
[ef8df33]35            response = self.root.handle(request)
[dc40fe9]36           
37        # Handle any errors that occur.  If an exception occurs that
38        # is an IPP error, then we can get the error code from the
39        # exception itself.
[6effd50]40        except ipp.errors.IPPException:
[dc40fe9]41            exctype, excval, exctb = sys.exc_info()
42            logger.error(traceback.format_exc())
[ef8df33]43            response = ipp.ops.make_empty_response(request)
44            excval.update_response(response)
[dc40fe9]45
46        # If it wasn't an IPP error, then it's our fault, so mark it
47        # as an internal server error
48        except Exception:
[7bd1035]49            logger.error(traceback.format_exc())
[ef8df33]50            response = ipp.ops.make_empty_response(request)
51            response.operation_id = ipp.StatusCodes.INTERNAL_ERROR
[7bd1035]52
53        # Send the response across HTTP
54        logger.debug("Sending response: %s" % repr(response))
[6effd50]55        try:
56            binary = response.packed_value
57        except:
58            logger.fatal(traceback.format_exc())
59            sys.exit(1)
60           
[7bd1035]61        self.send_response(200, "Gutenbach IPP Response")
62        self.send_header("Content-Type", "application/ipp")
63        self.send_header("Connection", "close")
64        self.end_headers()
[6effd50]65        self.wfile.write(binary)
Note: See TracBrowser for help on using the repository browser.