commit-gnue
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[gnue] r7886 - trunk/gnue-common/src/utils


From: johannes
Subject: [gnue] r7886 - trunk/gnue-common/src/utils
Date: Fri, 2 Sep 2005 06:35:19 -0500 (CDT)

Author: johannes
Date: 2005-09-02 06:35:14 -0500 (Fri, 02 Sep 2005)
New Revision: 7886

Added:
   trunk/gnue-common/src/utils/http.py
Log:
http-client and -server classes with some improvements regarding speed


Added: trunk/gnue-common/src/utils/http.py
===================================================================
--- trunk/gnue-common/src/utils/http.py 2005-09-01 07:21:12 UTC (rev 7885)
+++ trunk/gnue-common/src/utils/http.py 2005-09-02 11:35:14 UTC (rev 7886)
@@ -0,0 +1,208 @@
+# GNU Enterprise Common Library - Utilities - Fixes to the httplib classes
+#
+# Copyright 2001-2005 Free Software Foundation
+#
+# This file is part of GNU Enterprise
+#
+# GNU Enterprise is free software; you can redistribute it
+# and/or modify it under the terms of the GNU General Public
+# License as published by the Free Software Foundation; either
+# version 2, or (at your option) any later version.
+#
+# GNU Enterprise is distributed in the hope that it will be
+# useful, but WITHOUT ANY WARRANTY; without even the implied
+# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+# PURPOSE. See the GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public
+# License along with program; see the file COPYING. If not,
+# write to the Free Software Foundation, Inc., 59 Temple Place
+# - Suite 330, Boston, MA 02111-1307, USA.
+#
+# $Id$
+
+import httplib
+import BaseHTTPServer
+
+
+# =============================================================================
+# HTTPConnection sending headers and body within a single packet
+# =============================================================================
+
+class HTTPConnection (httplib.HTTPConnection):
+  """
+  Class implementing a HTTP/1.1 connection, where the headers and body of a
+  request is transmitted as a single packet. This improves communication speed
+  of persistent connections very much.
+  """
+
+  # ---------------------------------------------------------------------------
+  # Send a complete request to the server
+  # ---------------------------------------------------------------------------
+
+  def _send_request (self, method, url, body, headers):
+    """
+    Send a complete request to the server. This function is called by
+    L{request} and is nearly a copy of httplib.HTTPConnection._send_request,
+    having only a small change at the end.
+
+    @param method: HTTP request method, e.g. 'POST' or 'GET'
+    @param url: specifies the object beeing requested, e.g. '/index.html'
+    @param body: contents to be sent as request body
+    @param headers: dictionary of headers to be send as request headers
+    """
+
+    # honour explicitly requested Host: and Accept-Encoding headers
+    header_names = dict.fromkeys([k.lower() for k in headers])
+    skips = {}
+    if 'host' in header_names:
+        skips['skip_host'] = 1
+    if 'accept-encoding' in header_names:
+        skips['skip_accept_encoding'] = 1
+
+    self.putrequest(method, url, **skips)
+
+    if body and ('content-length' not in header_names):
+        self.putheader('Content-Length', str(len(body)))
+    for hdr, value in headers.iteritems():
+        self.putheader(hdr, value)
+
+    if body:
+      # This should be self.endheaders () without doing the actual send (). But
+      # we have to maintain the proper state.
+      self._buffer.extend (("", ""))
+
+      state = self.__dict__ ['_HTTPConnection__state']
+      if state == httplib._CS_REQ_STARTED:
+        self.__dict__ ['_HTTPConnection__state'] = httplib._CS_REQ_SENT
+
+      # Finally send the buffer and the body
+      self.send ('\r\n'.join (self._buffer) + body)
+      del self._buffer [:]
+
+    else:
+      self.endheaders ()
+
+
+# =============================================================================
+# HTTP request handler 
+# =============================================================================
+
+class HTTPRequestHandler (BaseHTTPServer.BaseHTTPRequestHandler):
+  """
+  HTTP request handler class adding the capability of buffered transfers. This
+  improves communication speed of persistent connections.
+  """
+
+  # ---------------------------------------------------------------------------
+  # Setup a handler
+  # ---------------------------------------------------------------------------
+
+  def setup (self):
+    """
+    Prepare the request handler for work
+    """
+
+    self._buffer = []
+    BaseHTTPServer.BaseHTTPRequestHandler.setup (self)
+
+
+  # ---------------------------------------------------------------------------
+  # Send server response
+  # ---------------------------------------------------------------------------
+
+  def send_response (self, code, message = None, flush = True):
+    """
+    Send the response header as well as two standard headers with the server
+    software and the current date. The response code will be logged.
+
+    @param code: response code
+    @param message: message of the response. If no message is given and the
+      code is listed in L{responses}, the corresponding standard message will 
be
+      sent.
+    @param flush: if True, the current buffer as well as the response will be
+      sent immediatley to the client, otherwise it will be buffered.
+    """
+
+    self.log_request (code)
+
+    if message is None:
+      if code in self.responses:
+        message = self.responses [code][0]
+      else:
+        message = ''
+
+    if self.request_version != 'HTTP/0.9':
+      self.write ("%s %d %s\r\n" % (self.protocol_version, code, message),
+                  flush)
+
+    self.send_header ('Server', self.version_string (), flush)
+    self.send_header ('Date', self.date_time_string (), flush)
+
+
+  # ---------------------------------------------------------------------------
+  # Send a MIME header
+  # ---------------------------------------------------------------------------
+
+  def send_header (self, keyword, value, flush = True):
+    """
+    Send a MIME header.
+
+    @param keyword: name of the header to send
+    @param value: value of the header
+    @param flush: if True, the current buffer as well as the MIME header will
+      be sent immediately, otherwise it will be buffered.
+    """
+
+    if self.request_version != 'HTTP/0.9':
+      self.write ("%s: %s\r\n" % (keyword, value), flush)
+
+    if keyword.lower () == 'connection':
+      if value.lower () == 'close':
+        self.close_connection = 1
+      elif value.lower () == 'keep-alive':
+        self.close_connection = 0
+
+
+  # ---------------------------------------------------------------------------
+  # End the block of MIME headers
+  # ---------------------------------------------------------------------------
+
+  def end_headers (self, flush = True):
+    """
+    Send the blank line ending the MIME headers.
+
+    @param flush: if True, send the current buffer and the blank line
+      immediately, otherwise add it to the buffer.
+    """
+
+    if self.request_version != 'HTTP/0.9':
+      self.write ("\r\n", flush)
+
+
+  # ---------------------------------------------------------------------------
+  # Buffer a message or transmit the current buffer
+  # ---------------------------------------------------------------------------
+
+  def write (self, message = None, flush = True):
+    """
+    Add a message to the transmission buffer or send the current buffer.
+
+    @param message: contents to be buffered or sent
+    @param flush: if True, the current buffer will be sent, otherwise message
+      will be added to the buffer. The buffer get's cleared after sending.
+    """
+
+    if flush:
+      data = ''.join (self._buffer)
+      if message is not None:
+        data += message
+
+      gDebug (2, "batch: %s" % self._buffer)
+      self.wfile.write (data)
+      self.wfile.flush ()
+
+      self._buffer = []
+
+    else:
+      self._buffer.append (message)


Property changes on: trunk/gnue-common/src/utils/http.py
___________________________________________________________________
Name: svn:keywords
   + Id





reply via email to

[Prev in Thread] Current Thread [Next in Thread]