Changeset 7c143c9 for server/lib
- 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)
- Location:
- server/lib/gutenbach
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
server/lib/gutenbach/ipp/core/request.py
r793432f r7c143c9 3 3 from .constants import AttributeTags 4 4 from .value import Value 5 from .errors import ClientErrorBadRequest 5 6 import sys 6 7 import struct 7 8 import logging 9 import tempfile 8 10 9 11 # initialize logger … … 83 85 # that file handle 84 86 if request is not None: 87 # minimum length is 88 if length < 9: 89 raise ClientErrorBadRequest("length (%d) < 9" % length) 90 85 91 # read the version-number (two signed chars) 86 92 self.version = struct.unpack('>bb', request.read(2)) … … 105 111 # read in the next byte 106 112 next_byte = struct.unpack('>b', request.read(1))[0] 107 length -= 1113 length -= 1 108 114 logger.debug("next byte : 0x%X" % next_byte) 109 115 … … 179 185 # once we hit the end-of-attributes tag, the only thing 180 186 # left is the data, so go ahead and read all of it 181 assert length >= 0 182 self.data = request.read(length) 183 logger.debug("data : %s" % self.data) 187 if length < 0: 188 raise ClientErrorBadRequest("length (%d) < 0" % length) 189 190 self.data = tempfile.TemporaryFile() 191 self.data.write(request.read(length)) 192 self.data.seek(0) 193 194 logger.debug("data : %d bytes" % length) 184 195 185 196 # otherwise, just set the class variables to the keyword … … 228 239 end_of_attributes_tag = struct.pack('>b', AttributeTags.END) 229 240 230 # convert the data to binary231 if self.data is not None:232 data = ''.join([struct.pack('>b', x) for x in self.data])233 else:234 data = ''235 236 241 # append everything together and return it 237 return preattributes + attribute_groups + end_of_attributes_tag +data242 return preattributes + attribute_groups + end_of_attributes_tag, self.data 238 243 239 244 def __repr__(self): -
server/lib/gutenbach/server/printer.py
ree8e6d0 r7c143c9 67 67 self.jobs = {} 68 68 69 self._next_jobid = 0 69 # cups ignores jobs with id 0, so we have to start at 1 70 self._next_jobid = 1 70 71 71 72 def __getattr__(self, attr): … … 218 219 self.jobs[job_id] = job 219 220 self.active_jobs.append(job_id) 220 print self.active_jobs221 221 return job 222 222 -
server/lib/gutenbach/server/requests.py
ree8e6d0 r7c143c9 41 41 42 42 def __init__(self): 43 print "init"44 43 self.printers = { 45 44 "test": GutenbachPrinter(name="test") … … 89 88 # actually get the handler 90 89 handler = getattr(self, handler_name) 91 logger.info(" Handling request of type'%s'" % handler_name)90 logger.info("request is '%s'" % handler_name) 92 91 93 92 # try to handle the request … … 116 115 117 116 def unknown_operation(self, request, response): 118 logger.warning(" Receivedunknown operation 0x%x" % request.operation_id)117 logger.warning("unknown operation 0x%x" % request.operation_id) 119 118 response = make_empty_response(request) 120 119 response.operation_id = ipp.StatusCodes.OPERATION_NOT_SUPPORTED -
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.