Changeset 1555
- Timestamp:
- 12/22/06 04:01:20
- Files:
-
- trunk/cherrypy/wsgiserver.py (modified) (12 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/cherrypy/wsgiserver.py
r1554 r1555 104 104 self.connection = connection 105 105 self.rfile = self.connection.rfile 106 self. wfile = self.connection.wfile106 self.sendall = self.connection.sendall 107 107 self.environ = connection.environ.copy() 108 108 … … 220 220 221 221 # then all the http headers 222 headers = rfc822.Message(self.rfile )222 headers = rfc822.Message(self.rfile, seekable=0) 223 223 self.environ.update(self.parse_headers(headers)) 224 224 … … 333 333 334 334 # Grab any trailer headers 335 headers = rfc822.Message(self.rfile )335 headers = rfc822.Message(self.rfile, seekable=0) 336 336 self.environ.update(self.parse_headers(headers)) 337 337 … … 343 343 def respond(self): 344 344 """Call the appropriate WSGI app and write its iterable output.""" 345 wfile = self.wfile346 345 response = self.wsgi_app(self.environ, self.start_response) 347 346 try: … … 356 355 self.send_headers() 357 356 if self.chunked_write: 358 wfile.write("0\r\n\r\n") 359 wfile.flush() 357 self.sendall("0\r\n\r\n") 360 358 361 359 def simple_response(self, status, msg=""): 362 360 """Write a simple response back to the client.""" 363 361 status = str(status) 364 wfile = self.wfile 365 wfile.write("%s %s\r\n" % (self.connection.server.protocol, status)) 366 wfile.write("Content-Length: %s\r\n" % len(msg)) 362 buf = ["%s %s\r\n" % (self.connection.server.protocol, status), 363 "Content-Length: %s\r\n" % len(msg)] 367 364 368 365 if status[:3] == "413" and self.response_protocol == 'HTTP/1.1': 369 366 # Request Entity Too Large 370 367 self.close_connection = True 371 wfile.write("Connection: close\r\n")372 373 wfile.write("\r\n")368 buf.append("Connection: close\r\n") 369 370 buf.append("\r\n") 374 371 if msg: 375 wfile.write(msg)376 wfile.flush()372 buf.append(msg) 373 self.sendall("".join(buf)) 377 374 378 375 def start_response(self, status, headers, exc_info = None): … … 400 397 self.sent_headers = True 401 398 self.send_headers() 402 wfile = self.wfile403 399 if self.chunked_write: 404 wfile.write(hex(len(chunk))[2:]) 405 wfile.write("\r\n") 406 wfile.write(chunk) 407 wfile.write("\r\n") 400 buf = [hex(len(chunk))[2:], 401 "\r\n", chunk, "\r\n"] 402 self.sendall("".join(buf)) 408 403 else: 409 wfile.write(chunk) 410 wfile.flush() 404 self.sendall(chunk) 411 405 412 406 def send_headers(self): … … 437 431 438 432 server = self.connection.server 439 wfile = self.wfile440 433 441 434 if "server" not in hkeys: 442 435 self.outheaders.append(("Server", server.version)) 443 436 444 wfile.write(server.protocol + " " + self.status + "\r\n")437 buf = [server.protocol, " ", self.status, "\r\n"] 445 438 try: 446 439 for k, v in self.outheaders: 447 wfile.write(k + ": " + v + "\r\n")440 buf.append(k + ": " + v + "\r\n") 448 441 except TypeError: 449 442 if not isinstance(k, str): … … 453 446 else: 454 447 raise 455 wfile.write("\r\n")456 wfile.flush()448 buf.append("\r\n") 449 self.sendall("".join(buf)) 457 450 458 451 … … 521 514 environ: a WSGI environ template. This will be copied for each request. 522 515 rfile: a fileobject for reading from the socket. 523 wfile: a fileobject for writingto the socket.516 sendall: a function for writing (+ flush) to the socket. 524 517 """ 525 518 526 519 rbufsize = -1 527 wbufsize = -1528 520 RequestHandlerClass = HTTPRequest 529 521 environ = {"wsgi.version": (1, 0), … … 547 539 self.rfile = SSL_fileobject(sock, "r", self.rbufsize) 548 540 self.rfile.ssl_timeout = timeout 549 self.wfile = SSL_fileobject(sock, "w", self.wbufsize) 550 self.wfile.ssl_timeout = timeout 541 self.sendall = _ssl_wrap_method(sock.sendall) 551 542 self.environ["wsgi.url_scheme"] = "https" 552 543 self.environ["HTTPS"] = "on" … … 555 546 self.environ.update(sslenv) 556 547 else: 557 self.rfile = s elf.socket.makefile("r", self.rbufsize)558 self. wfile = self.socket.makefile("w", self.wbufsize)548 self.rfile = sock.makefile("r", self.rbufsize) 549 self.sendall = sock.sendall 559 550 560 551 self.environ.update({"wsgi.input": self.rfile, … … 605 596 """Close the socket underlying this connection.""" 606 597 self.rfile.close() 607 self.wfile.close()608 598 self.socket.close() 609 599

