Ignore:
Timestamp:
Dec 27, 2011, 10:20:10 PM (12 years ago)
Author:
Jessica B. Hamrick <jhamrick@…>
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)
Message:

Add support for chunking, i.e. receiving file data

File:
1 edited

Legend:

Unmodified
Added
Removed
  • server/lib/gutenbach/server/server.py

    ree8e6d0 r7c143c9  
    55import sys
    66import traceback
     7import tempfile
    78
    89# initialize logger
     
    1314
    1415class 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               
    1567    def do_POST(self):
    16         # Receive a request
    1768        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)
    2280
    2381        # Get the handler and pass it the request and response
    2482        # objects.  It will fill in values for the response object or
    2583        # 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.