Changeset 7c143c9 for server/lib/gutenbach/server/server.py
- Timestamp:
- Dec 27, 2011, 10:20:10 PM (12 years ago)
- Branches:
- no-cups
- Children:
- e58af05
- Parents:
- ee8e6d0
- git-author:
- Jessica B. Hamrick <jhamrick@…> (12/27/11 22:20:10)
- git-committer:
- Jessica B. Hamrick <jhamrick@…> (12/27/11 22:20:10)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
server/lib/gutenbach/server/server.py
ree8e6d0 r7c143c9 5 5 import sys 6 6 import traceback 7 import tempfile 7 8 8 9 # initialize logger … … 13 14 14 15 class GutenbachIPPServer(BaseHTTPServer.BaseHTTPRequestHandler): 16 def send_continue(self): 17 self.send_response(100, "continue") 18 self.send_header("Content-Type", "application/ipp") 19 self.end_headers() 20 21 def send_ok(self, response): 22 logger.debug(repr(response)) 23 binary, data_file = response.packed_value 24 25 self.send_response(200, "ok") 26 self.send_header("Content-Type", "application/ipp") 27 self.send_header("Connection", "close") 28 self.end_headers() 29 30 self.wfile.write(binary) 31 if data_file is not None: 32 data = data_file.read(1024) 33 while data != '': 34 self.wfile.write(data) 35 data = data_file.read(1024) 36 37 def log_request(self, code=0, size=0): 38 logger.info("response (%s)" % code) 39 40 def log_message(self, fmt, *args): 41 logger.info(fmt % args) 42 43 def read_chunks(self): 44 size = sys.maxint 45 totalsize = 0 46 47 with tempfile.SpooledTemporaryFile() as tmp: 48 while size > 0: 49 a, b = self.rfile.read(2) 50 size = a + b 51 while not (a == "\r" and b == "\n"): 52 a = b 53 b = self.rfile.read(1) 54 size += b 55 size = int(size[:-2], base=16) 56 totalsize += size 57 chunk = self.rfile.read(size) 58 clrf = self.rfile.read(2) 59 assert clrf == "\r\n" 60 tmp.write(chunk) 61 62 tmp.seek(0) 63 request = ipp.Request(request=tmp, length=totalsize) 64 65 return request 66 15 67 def do_POST(self): 16 # Receive a request17 68 length = int(self.headers.getheader('content-length', 0)) 18 if length == 0: 19 logger.warning("content-length == 0") 20 return 21 request = ipp.Request(request=self.rfile, length=length) 69 expect = self.headers.getheader('expect', None) 70 encoding = self.headers.getheader('transfer-encoding', None) 71 72 logger.info("request %s (%d bytes)" % (self.command, length)) 73 logger.debug(str(self.headers)) 74 75 # Parse the request 76 if length == 0 and encoding == "chunked": 77 request = self.read_chunks() 78 else: 79 request = ipp.Request(request=self.rfile, length=length) 22 80 23 81 # Get the handler and pass it the request and response 24 82 # objects. It will fill in values for the response object or 25 83 # throw a fatal error. 26 logger.debug("Received request: %s" % repr(request)) 27 try: 28 response = handler.handle(request) 29 except: 30 logger.fatal(traceback.format_exc()) 31 sys.exit(1) 32 33 # Send the response across HTTP 34 logger.debug("Sending response: %s" % repr(response)) 35 try: 36 binary = response.packed_value 37 except: 38 logger.fatal(traceback.format_exc()) 39 sys.exit(1) 40 41 self.send_response(200, "Gutenbach IPP Response") 42 self.send_header("Content-Type", "application/ipp") 43 self.send_header("Connection", "close") 44 self.end_headers() 45 self.wfile.write(binary) 84 logger.debug("request: %s" % repr(request)) 85 response = handler.handle(request) 86 self.send_ok(response)
Note: See TracChangeset
for help on using the changeset viewer.