from eventlet.green import BaseHTTPServer
from eventlet.green import socket
-from eventlet.green import urllib
from eventlet import greenio
from eventlet import greenpool
from eventlet import support
from eventlet.support import six
+from eventlet.support.six.moves import urllib
+
DEFAULT_MAX_SIMULTANEOUS_REQUESTS = 1024
DEFAULT_MAX_HTTP_VERSION = 'HTTP/1.1'
pass
+def get_logger(log, debug):
+ if callable(getattr(log, 'info', None)) \
+ and callable(getattr(log, 'debug', None)):
+ return log
+ else:
+ return LoggerFileWrapper(log, debug)
+
+
+class LoggerFileWrapper(object):
+ def __init__(self, log, debug):
+ self.log = log
+ self._debug = debug
+
+ def info(self, msg, *args, **kwargs):
+ self.write(msg, *args)
+
+ def debug(self, msg, *args, **kwargs):
+ if self._debug:
+ self.write(msg, *args)
+
+ def write(self, msg, *args):
+ msg = msg + '\n'
+ if args:
+ msg = msg % args
+ self.log.write(msg)
+
+
class FileObjectForHeaders(object):
def __init__(self, fp):
towrite.append(six.b("%x" % (len(data),)) + b"\r\n" + data + b"\r\n")
else:
towrite.append(data)
- try:
- _writelines(towrite)
- length[0] = length[0] + sum(map(len, towrite))
- except UnicodeEncodeError:
- self.server.log_message(
- "Encountered non-ascii unicode while attempting to write"
- "wsgi response: %r" %
- [x for x in towrite if isinstance(x, six.text_type)])
- self.server.log_message(traceback.format_exc())
- _writelines(
- ["HTTP/1.1 500 Internal Server Error\r\n",
- "Connection: close\r\n",
- "Content-type: text/plain\r\n",
- "Content-length: 98\r\n",
- "Date: %s\r\n" % format_date_time(time.time()),
- "\r\n",
- ("Internal Server Error: wsgi application passed "
- "a unicode object to the server instead of a string.")])
+ _writelines(towrite)
+ length[0] = length[0] + sum(map(len, towrite))
def start_response(status, response_headers, exc_info=None):
status_code[0] = status.split()[0]
minimum_write_chunk_size = int(self.environ.get(
'eventlet.minimum_write_chunk_size', self.minimum_chunk_size))
for data in result:
+ if isinstance(data, six.text_type):
+ data = data.encode('ascii')
+
towrite.append(data)
towrite_size += len(data)
if towrite_size >= minimum_write_chunk_size:
except Exception:
self.close_connection = 1
tb = traceback.format_exc()
- self.server.log_message(tb)
- if not headers_set:
+ self.server.log.info(tb)
+ if not headers_sent:
err_body = six.b(tb) if self.server.debug else b''
start_response("500 Internal Server Error",
[('Content-type', 'text/plain'),
hook(self.environ, *args, **kwargs)
if self.server.log_output:
- self.server.log_message(self.server.log_format % {
+ self.server.log.info(self.server.log_format % {
'client_ip': self.get_client_ip(),
'client_port': self.client_address[1],
'date_time': self.log_date_time_string(),
pq = self.path.split('?', 1)
env['RAW_PATH_INFO'] = pq[0]
- env['PATH_INFO'] = urllib.unquote(pq[0])
+ env['PATH_INFO'] = urllib.parse.unquote(pq[0])
if len(pq) > 1:
env['QUERY_STRING'] = pq[1]
self.socket = socket
self.address = address
if log:
- self.log = log
+ self.log = get_logger(log, debug)
else:
- self.log = sys.stderr
+ self.log = get_logger(sys.stderr, debug)
self.app = app
self.keepalive = keepalive
self.environ = environ
except socket.timeout:
# Expected exceptions are not exceptional
sock.close()
- if self.debug:
- # similar to logging "accepted" in server()
- self.log_message('(%s) timed out %r' % (self.pid, address))
+ # similar to logging "accepted" in server()
+ self.log.debug('(%s) timed out %r' % (self.pid, address))
def log_message(self, message):
- self.log.write(message + '\n')
+ warnings.warn('server.log_message is deprecated. Please use server.log.info instead')
+ self.log.info(message)
try:
if port == ':80':
port = ''
- serv.log.write("(%s) wsgi starting up on %s://%s%s/\n" % (
+ serv.log.info("(%s) wsgi starting up on %s://%s%s/" % (
serv.pid, scheme, host, port))
while is_accepting:
try:
client_socket = sock.accept()
client_socket[0].settimeout(serv.socket_timeout)
- if debug:
- serv.log.write("(%s) accepted %r\n" % (
- serv.pid, client_socket[1]))
+ serv.log.debug("(%s) accepted %r" % (
+ serv.pid, client_socket[1]))
try:
pool.spawn_n(serv.process_request, client_socket)
except AttributeError:
if support.get_errno(e) not in ACCEPT_ERRNO:
raise
except (KeyboardInterrupt, SystemExit):
- serv.log.write("wsgi exiting\n")
+ serv.log.info("wsgi exiting")
break
finally:
pool.waitall()
- serv.log.write("(%s) wsgi exited, is_accepting=%s\n" % (
+ serv.log.info("(%s) wsgi exited, is_accepting=%s" % (
serv.pid, is_accepting))
try:
# NOTE: It's not clear whether we want this to leave the