Xen: use utils.Readfile to read the VNC password
[ganeti-local] / lib / http / __init__.py
index dab1327..5b09680 100644 (file)
@@ -124,9 +124,9 @@ class HttpException(Exception):
 class HttpBadRequest(HttpException):
   """400 Bad Request
 
 class HttpBadRequest(HttpException):
   """400 Bad Request
 
-  RFC2616, 10.4.1: The request could not be understood by the server due to
-  malformed syntax. The client SHOULD NOT repeat the request without
-  modifications.
+  RFC2616, 10.4.1: The request could not be understood by the server
+  due to malformed syntax. The client SHOULD NOT repeat the request
+  without modifications.
 
   """
   code = 400
 
   """
   code = 400
@@ -135,9 +135,10 @@ class HttpBadRequest(HttpException):
 class HttpUnauthorized(HttpException):
   """401 Unauthorized
 
 class HttpUnauthorized(HttpException):
   """401 Unauthorized
 
-  RFC2616, section 10.4.2: The request requires user authentication. The
-  response MUST include a WWW-Authenticate header field (section 14.47)
-  containing a challenge applicable to the requested resource.
+  RFC2616, section 10.4.2: The request requires user
+  authentication. The response MUST include a WWW-Authenticate header
+  field (section 14.47) containing a challenge applicable to the
+  requested resource.
 
   """
   code = 401
 
   """
   code = 401
@@ -146,9 +147,9 @@ class HttpUnauthorized(HttpException):
 class HttpForbidden(HttpException):
   """403 Forbidden
 
 class HttpForbidden(HttpException):
   """403 Forbidden
 
-  RFC2616, 10.4.4: The server understood the request, but is refusing to
-  fulfill it.  Authorization will not help and the request SHOULD NOT be
-  repeated.
+  RFC2616, 10.4.4: The server understood the request, but is refusing
+  to fulfill it.  Authorization will not help and the request SHOULD
+  NOT be repeated.
 
   """
   code = 403
 
   """
   code = 403
@@ -157,8 +158,9 @@ class HttpForbidden(HttpException):
 class HttpNotFound(HttpException):
   """404 Not Found
 
 class HttpNotFound(HttpException):
   """404 Not Found
 
-  RFC2616, 10.4.5: The server has not found anything matching the Request-URI.
-  No indication is given of whether the condition is temporary or permanent.
+  RFC2616, 10.4.5: The server has not found anything matching the
+  Request-URI.  No indication is given of whether the condition is
+  temporary or permanent.
 
   """
   code = 404
 
   """
   code = 404
@@ -167,9 +169,10 @@ class HttpNotFound(HttpException):
 class HttpMethodNotAllowed(HttpException):
   """405 Method Not Allowed
 
 class HttpMethodNotAllowed(HttpException):
   """405 Method Not Allowed
 
-  RFC2616, 10.4.6: The method specified in the Request-Line is not allowed for
-  the resource identified by the Request-URI. The response MUST include an
-  Allow header containing a list of valid methods for the requested resource.
+  RFC2616, 10.4.6: The method specified in the Request-Line is not
+  allowed for the resource identified by the Request-URI. The response
+  MUST include an Allow header containing a list of valid methods for
+  the requested resource.
 
   """
   code = 405
 
   """
   code = 405
@@ -178,9 +181,9 @@ class HttpMethodNotAllowed(HttpException):
 class HttpRequestTimeout(HttpException):
   """408 Request Timeout
 
 class HttpRequestTimeout(HttpException):
   """408 Request Timeout
 
-  RFC2616, 10.4.9: The client did not produce a request within the time that
-  the server was prepared to wait. The client MAY repeat the request without
-  modifications at any later time.
+  RFC2616, 10.4.9: The client did not produce a request within the
+  time that the server was prepared to wait. The client MAY repeat the
+  request without modifications at any later time.
 
   """
   code = 408
 
   """
   code = 408
@@ -189,10 +192,10 @@ class HttpRequestTimeout(HttpException):
 class HttpConflict(HttpException):
   """409 Conflict
 
 class HttpConflict(HttpException):
   """409 Conflict
 
-  RFC2616, 10.4.10: The request could not be completed due to a conflict with
-  the current state of the resource. This code is only allowed in situations
-  where it is expected that the user might be able to resolve the conflict and
-  resubmit the request.
+  RFC2616, 10.4.10: The request could not be completed due to a
+  conflict with the current state of the resource. This code is only
+  allowed in situations where it is expected that the user might be
+  able to resolve the conflict and resubmit the request.
 
   """
   code = 409
 
   """
   code = 409
@@ -201,9 +204,9 @@ class HttpConflict(HttpException):
 class HttpGone(HttpException):
   """410 Gone
 
 class HttpGone(HttpException):
   """410 Gone
 
-  RFC2616, 10.4.11: The requested resource is no longer available at the server
-  and no forwarding address is known. This condition is expected to be
-  considered permanent.
+  RFC2616, 10.4.11: The requested resource is no longer available at
+  the server and no forwarding address is known. This condition is
+  expected to be considered permanent.
 
   """
   code = 410
 
   """
   code = 410
@@ -212,10 +215,10 @@ class HttpGone(HttpException):
 class HttpLengthRequired(HttpException):
   """411 Length Required
 
 class HttpLengthRequired(HttpException):
   """411 Length Required
 
-  RFC2616, 10.4.12: The server refuses to accept the request without a defined
-  Content-Length. The client MAY repeat the request if it adds a valid
-  Content-Length header field containing the length of the message-body in the
-  request message.
+  RFC2616, 10.4.12: The server refuses to accept the request without a
+  defined Content-Length. The client MAY repeat the request if it adds
+  a valid Content-Length header field containing the length of the
+  message-body in the request message.
 
   """
   code = 411
 
   """
   code = 411
@@ -224,18 +227,19 @@ class HttpLengthRequired(HttpException):
 class HttpPreconditionFailed(HttpException):
   """412 Precondition Failed
 
 class HttpPreconditionFailed(HttpException):
   """412 Precondition Failed
 
-  RFC2616, 10.4.13: The precondition given in one or more of the request-header
-  fields evaluated to false when it was tested on the server.
+  RFC2616, 10.4.13: The precondition given in one or more of the
+  request-header fields evaluated to false when it was tested on the
+  server.
 
   """
   code = 412
 
 
 
   """
   code = 412
 
 
-class HttpInternalError(HttpException):
+class HttpInternalServerError(HttpException):
   """500 Internal Server Error
 
   """500 Internal Server Error
 
-  RFC2616, 10.5.1: The server encountered an unexpected condition which
-  prevented it from fulfilling the request.
+  RFC2616, 10.5.1: The server encountered an unexpected condition
+  which prevented it from fulfilling the request.
 
   """
   code = 500
 
   """
   code = 500
@@ -244,8 +248,8 @@ class HttpInternalError(HttpException):
 class HttpNotImplemented(HttpException):
   """501 Not Implemented
 
 class HttpNotImplemented(HttpException):
   """501 Not Implemented
 
-  RFC2616, 10.5.2: The server does not support the functionality required to
-  fulfill the request.
+  RFC2616, 10.5.2: The server does not support the functionality
+  required to fulfill the request.
 
   """
   code = 501
 
   """
   code = 501
@@ -254,8 +258,8 @@ class HttpNotImplemented(HttpException):
 class HttpServiceUnavailable(HttpException):
   """503 Service Unavailable
 
 class HttpServiceUnavailable(HttpException):
   """503 Service Unavailable
 
-  RFC2616, 10.5.4: The server is currently unable to handle the request due to
-  a temporary overloading or maintenance of the server.
+  RFC2616, 10.5.4: The server is currently unable to handle the
+  request due to a temporary overloading or maintenance of the server.
 
   """
   code = 503
 
   """
   code = 503
@@ -264,8 +268,8 @@ class HttpServiceUnavailable(HttpException):
 class HttpVersionNotSupported(HttpException):
   """505 HTTP Version Not Supported
 
 class HttpVersionNotSupported(HttpException):
   """505 HTTP Version Not Supported
 
-  RFC2616, 10.5.6: The server does not support, or refuses to support, the HTTP
-  protocol version that was used in the request message.
+  RFC2616, 10.5.6: The server does not support, or refuses to support,
+  the HTTP protocol version that was used in the request message.
 
   """
   code = 505
 
   """
   code = 505
@@ -281,11 +285,9 @@ class HttpJsonConverter:
     return serializer.LoadJson(data)
 
 
     return serializer.LoadJson(data)
 
 
-def WaitForSocketCondition(poller, sock, event, timeout):
+def WaitForSocketCondition(sock, event, timeout):
   """Waits for a condition to occur on the socket.
 
   """Waits for a condition to occur on the socket.
 
-  @type poller: select.Poller
-  @param poller: Poller object as created by select.poll()
   @type sock: socket
   @param sock: Wait for events on this socket
   @type event: int
   @type sock: socket
   @param sock: Wait for events on this socket
   @type event: int
@@ -303,6 +305,7 @@ def WaitForSocketCondition(poller, sock, event, timeout):
     # Poller object expects milliseconds
     timeout *= 1000
 
     # Poller object expects milliseconds
     timeout *= 1000
 
+  poller = select.poll()
   poller.register(sock, event)
   try:
     while True:
   poller.register(sock, event)
   try:
     while True:
@@ -320,14 +323,12 @@ def WaitForSocketCondition(poller, sock, event, timeout):
     poller.unregister(sock)
 
 
     poller.unregister(sock)
 
 
-def SocketOperation(poller, sock, op, arg1, timeout):
+def SocketOperation(sock, op, arg1, timeout):
   """Wrapper around socket functions.
 
   This function abstracts error handling for socket operations, especially
   for the complicated interaction with OpenSSL.
 
   """Wrapper around socket functions.
 
   This function abstracts error handling for socket operations, especially
   for the complicated interaction with OpenSSL.
 
-  @type poller: select.Poller
-  @param poller: Poller object as created by select.poll()
   @type sock: socket
   @param sock: Socket for the operation
   @type op: int
   @type sock: socket
   @param sock: Socket for the operation
   @type op: int
@@ -375,7 +376,7 @@ def SocketOperation(poller, sock, op, arg1, timeout):
       else:
         wait_for_event = event_poll
 
       else:
         wait_for_event = event_poll
 
-      event = WaitForSocketCondition(poller, sock, wait_for_event, timeout)
+      event = WaitForSocketCondition(sock, wait_for_event, timeout)
       if event is None:
         raise HttpSocketTimeout()
 
       if event is None:
         raise HttpSocketTimeout()
 
@@ -464,34 +465,30 @@ def SocketOperation(poller, sock, op, arg1, timeout):
       raise
 
 
       raise
 
 
-def ShutdownConnection(poller, sock, close_timeout, write_timeout, msgreader,
-                       force):
+def ShutdownConnection(sock, close_timeout, write_timeout, msgreader, force):
   """Closes the connection.
 
   """Closes the connection.
 
-  @type poller: select.Poller
-  @param poller: Poller object as created by select.poll()
   @type sock: socket
   @param sock: Socket to be shut down
   @type close_timeout: float
   @type sock: socket
   @param sock: Socket to be shut down
   @type close_timeout: float
-  @param close_timeout: How long to wait for the peer to close the connection
+  @param close_timeout: How long to wait for the peer to close
+      the connection
   @type write_timeout: float
   @param write_timeout: Write timeout for shutdown
   @type msgreader: http.HttpMessageReader
   @type write_timeout: float
   @param write_timeout: Write timeout for shutdown
   @type msgreader: http.HttpMessageReader
-  @param msgreader: Request message reader, used to determine whether peer
-                    should close connection
+  @param msgreader: Request message reader, used to determine whether
+      peer should close connection
   @type force: bool
   @type force: bool
-  @param force: Whether to forcibly close the connection without waiting
-                for peer
+  @param force: Whether to forcibly close the connection without
+      waiting for peer
 
   """
 
   """
-  poller = select.poll()
-
   #print msgreader.peer_will_close, force
   if msgreader and msgreader.peer_will_close and not force:
     # Wait for peer to close
     try:
       # Check whether it's actually closed
   #print msgreader.peer_will_close, force
   if msgreader and msgreader.peer_will_close and not force:
     # Wait for peer to close
     try:
       # Check whether it's actually closed
-      if not SocketOperation(poller, sock, SOCKOP_RECV, 1, close_timeout):
+      if not SocketOperation(sock, SOCKOP_RECV, 1, close_timeout):
         return
     except (socket.error, HttpError, HttpSocketTimeout):
       # Ignore errors at this stage
         return
     except (socket.error, HttpError, HttpSocketTimeout):
       # Ignore errors at this stage
@@ -500,7 +497,7 @@ def ShutdownConnection(poller, sock, close_timeout, write_timeout, msgreader,
   # Close the connection from our side
   try:
     # We don't care about the return value, see NOTES in SSL_shutdown(3).
   # Close the connection from our side
   try:
     # We don't care about the return value, see NOTES in SSL_shutdown(3).
-    SocketOperation(poller, sock, SOCKOP_SHUTDOWN, socket.SHUT_RDWR,
+    SocketOperation(sock, SOCKOP_SHUTDOWN, socket.SHUT_RDWR,
                     write_timeout)
   except HttpSocketTimeout:
     raise HttpError("Timeout while shutting down connection")
                     write_timeout)
   except HttpSocketTimeout:
     raise HttpError("Timeout while shutting down connection")
@@ -510,11 +507,9 @@ def ShutdownConnection(poller, sock, close_timeout, write_timeout, msgreader,
       raise HttpError("Error while shutting down connection: %s" % err)
 
 
       raise HttpError("Error while shutting down connection: %s" % err)
 
 
-def Handshake(poller, sock, write_timeout):
+def Handshake(sock, write_timeout):
   """Shakes peer's hands.
 
   """Shakes peer's hands.
 
-  @type poller: select.Poller
-  @param poller: Poller object as created by select.poll()
   @type sock: socket
   @param sock: Socket to be shut down
   @type write_timeout: float
   @type sock: socket
   @param sock: Socket to be shut down
   @type write_timeout: float
@@ -522,7 +517,7 @@ def Handshake(poller, sock, write_timeout):
 
   """
   try:
 
   """
   try:
-    return SocketOperation(poller, sock, SOCKOP_HANDSHAKE, None, write_timeout)
+    return SocketOperation(sock, SOCKOP_HANDSHAKE, None, write_timeout)
   except HttpSocketTimeout:
     raise HttpError("Timeout during SSL handshake")
   except socket.error, err:
   except HttpSocketTimeout:
     raise HttpError("Timeout during SSL handshake")
   except socket.error, err:
@@ -539,7 +534,8 @@ class HttpSslParams(object):
     @type ssl_key_path: string
     @param ssl_key_path: Path to file containing SSL key in PEM format
     @type ssl_cert_path: string
     @type ssl_key_path: string
     @param ssl_key_path: Path to file containing SSL key in PEM format
     @type ssl_cert_path: string
-    @param ssl_cert_path: Path to file containing SSL certificate in PEM format
+    @param ssl_cert_path: Path to file containing SSL certificate
+        in PEM format
 
     """
     self.ssl_key_pem = utils.ReadFile(ssl_key_path)
 
     """
     self.ssl_key_pem = utils.ReadFile(ssl_key_path)
@@ -570,8 +566,8 @@ class HttpBase(object):
     @type ssl_params: HttpSslParams
     @param ssl_params: SSL key and certificate
     @type ssl_verify_peer: bool
     @type ssl_params: HttpSslParams
     @param ssl_params: SSL key and certificate
     @type ssl_verify_peer: bool
-    @param ssl_verify_peer: Whether to require client certificate and compare
-                            it with our certificate
+    @param ssl_verify_peer: Whether to require client certificate
+        and compare it with our certificate
 
     """
     self._ssl_params = ssl_params
 
     """
     self._ssl_params = ssl_params
@@ -672,16 +668,13 @@ class HttpMessageWriter(object):
 
     buf = self._FormatMessage()
 
 
     buf = self._FormatMessage()
 
-    poller = select.poll()
-
     pos = 0
     end = len(buf)
     while pos < end:
       # Send only SOCK_BUF_SIZE bytes at a time
       data = buf[pos:(pos + SOCK_BUF_SIZE)]
 
     pos = 0
     end = len(buf)
     while pos < end:
       # Send only SOCK_BUF_SIZE bytes at a time
       data = buf[pos:(pos + SOCK_BUF_SIZE)]
 
-      sent = SocketOperation(poller, sock, SOCKOP_SEND, data,
-                             write_timeout)
+      sent = SocketOperation(sock, SOCKOP_SEND, data, write_timeout)
 
       # Remove sent bytes
       pos += sent
 
       # Remove sent bytes
       pos += sent
@@ -761,7 +754,6 @@ class HttpMessageReader(object):
     self.sock = sock
     self.msg = msg
 
     self.sock = sock
     self.msg = msg
 
-    self.poller = select.poll()
     self.start_line_buffer = None
     self.header_buffer = StringIO()
     self.body_buffer = StringIO()
     self.start_line_buffer = None
     self.header_buffer = StringIO()
     self.body_buffer = StringIO()
@@ -774,8 +766,7 @@ class HttpMessageReader(object):
     while self.parser_status != self.PS_COMPLETE:
       # TODO: Don't read more than necessary (Content-Length), otherwise
       # data might be lost and/or an error could occur
     while self.parser_status != self.PS_COMPLETE:
       # TODO: Don't read more than necessary (Content-Length), otherwise
       # data might be lost and/or an error could occur
-      data = SocketOperation(self.poller, sock, SOCKOP_RECV, SOCK_BUF_SIZE,
-                             read_timeout)
+      data = SocketOperation(sock, SOCKOP_RECV, SOCK_BUF_SIZE, read_timeout)
 
       if data:
         buf += data
 
       if data:
         buf += data
@@ -974,9 +965,9 @@ class HttpMessageReader(object):
 
     This function also adjusts internal variables based on header values.
 
 
     This function also adjusts internal variables based on header values.
 
-    RFC2616, section 4.3: "The presence of a message-body in a request is
+    RFC2616, section 4.3: The presence of a message-body in a request is
     signaled by the inclusion of a Content-Length or Transfer-Encoding header
     signaled by the inclusion of a Content-Length or Transfer-Encoding header
-    field in the request's message-headers."
+    field in the request's message-headers.
 
     """
     # Parse headers
 
     """
     # Parse headers