Skip to content
This repository has been archived by the owner on Jan 9, 2020. It is now read-only.

Commit

Permalink
Merge branch 'master' of git://github.com/facebook/tornado
Browse files Browse the repository at this point in the history
  • Loading branch information
Alexander Saltanov committed Mar 27, 2010
2 parents fefbe3f + a4ba918 commit 7b4ef60
Show file tree
Hide file tree
Showing 16 changed files with 283 additions and 73 deletions.
19 changes: 10 additions & 9 deletions tornado/auth.py
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@ def _on_auth(self, user):
import urlparse
import uuid

_log = logging.getLogger("tornado.auth")

class OpenIdMixin(object):
"""Abstract implementation of OpenID and Attribute Exchange.
Expand Down Expand Up @@ -145,7 +146,7 @@ def _openid_args(self, callback_uri, ax_attrs=[], oauth_scope=None):

def _on_authentication_verified(self, callback, response):
if response.error or u"is_valid:true" not in response.body:
logging.warning("Invalid OpenID response: %s", response.error or
_log.warning("Invalid OpenID response: %s", response.error or
response.body)
callback(None)
return
Expand Down Expand Up @@ -232,12 +233,12 @@ def get_authenticated_user(self, callback):
request_key = self.get_argument("oauth_token")
request_cookie = self.get_cookie("_oauth_request_token")
if not request_cookie:
logging.warning("Missing OAuth request token cookie")
_log.warning("Missing OAuth request token cookie")
callback(None)
return
cookie_key, cookie_secret = request_cookie.split("|")
if cookie_key != request_key:
logging.warning("Request token does not match cookie")
_log.warning("Request token does not match cookie")
callback(None)
return
token = dict(key=cookie_key, secret=cookie_secret)
Expand Down Expand Up @@ -289,7 +290,7 @@ def _oauth_access_token_url(self, request_token):

def _on_access_token(self, callback, response):
if response.error:
logging.warning("Could not fetch access token")
_log.warning("Could not fetch access token")
callback(None)
return
access_token = _oauth_parse_response(response.body)
Expand Down Expand Up @@ -441,7 +442,7 @@ def _on_post(self, new_entry):

def _on_twitter_request(self, callback, response):
if response.error:
logging.warning("Error response %s fetching %s", response.error,
_log.warning("Error response %s fetching %s", response.error,
response.request.url)
callback(None)
return
Expand Down Expand Up @@ -561,7 +562,7 @@ def _on_post(self, new_entry):

def _on_friendfeed_request(self, callback, response):
if response.error:
logging.warning("Error response %s fetching %s", response.error,
_log.warning("Error response %s fetching %s", response.error,
response.request.url)
callback(None)
return
Expand Down Expand Up @@ -819,17 +820,17 @@ def _on_get_user_info(self, callback, session, users):

def _parse_response(self, callback, response):
if response.error:
logging.warning("HTTP error from Facebook: %s", response.error)
_log.warning("HTTP error from Facebook: %s", response.error)
callback(None)
return
try:
json = escape.json_decode(response.body)
except:
logging.warning("Invalid JSON from Facebook: %r", response.body)
_log.warning("Invalid JSON from Facebook: %r", response.body)
callback(None)
return
if isinstance(json, dict) and json.get("error_code"):
logging.warning("Facebook error: %d: %r", json["error_code"],
_log.warning("Facebook error: %d: %r", json["error_code"],
json.get("error_msg"))
callback(None)
return
Expand Down
3 changes: 2 additions & 1 deletion tornado/autoreload.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
import sys
import types

_log = logging.getLogger('tornado.autoreload')

def start(io_loop=None, check_time=500):
"""Restarts the process automatically when a module is modified.
Expand Down Expand Up @@ -68,7 +69,7 @@ def _reload_on_update(io_loop, modify_times):
modify_times[path] = modified
continue
if modify_times[path] != modified:
logging.info("%s modified; restarting server", path)
_log.info("%s modified; restarting server", path)
_reload_attempted = True
for fd in io_loop._handlers.keys():
try:
Expand Down
5 changes: 3 additions & 2 deletions tornado/database.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
import itertools
import logging

_log = logging.getLogger('tornado.database')

class Connection(object):
"""A lightweight wrapper around MySQLdb DB-API connections.
Expand Down Expand Up @@ -71,7 +72,7 @@ def __init__(self, host, database, user=None, password=None):
try:
self.reconnect()
except:
logging.error("Cannot connect to MySQL on %s", self.host,
_log.error("Cannot connect to MySQL on %s", self.host,
exc_info=True)

def __del__(self):
Expand Down Expand Up @@ -150,7 +151,7 @@ def _execute(self, cursor, query, parameters):
try:
return cursor.execute(query, parameters)
except OperationalError:
logging.error("Error connecting to MySQL on %s", self.host)
_log.error("Error connecting to MySQL on %s", self.host)
self.close()
raise

Expand Down
15 changes: 8 additions & 7 deletions tornado/httpclient.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
import time
import weakref

_log = logging.getLogger('tornado.httpclient')

class HTTPClient(object):
"""A blocking HTTP client backed with pycurl.
Expand Down Expand Up @@ -342,7 +343,7 @@ def __init__(self, errno, message):

def _curl_create(max_simultaneous_connections=None):
curl = pycurl.Curl()
if logging.getLogger().isEnabledFor(logging.DEBUG):
if _log.isEnabledFor(logging.DEBUG):
curl.setopt(pycurl.VERBOSE, 1)
curl.setopt(pycurl.DEBUGFUNCTION, _curl_debug)
curl.setopt(pycurl.MAXCONNECTS, max_simultaneous_connections or 5)
Expand Down Expand Up @@ -417,11 +418,11 @@ def ioctl(cmd):
userpwd = "%s:%s" % (request.auth_username, request.auth_password)
curl.setopt(pycurl.HTTPAUTH, pycurl.HTTPAUTH_BASIC)
curl.setopt(pycurl.USERPWD, userpwd)
logging.info("%s %s (username: %r)", request.method, request.url,
_log.info("%s %s (username: %r)", request.method, request.url,
request.auth_username)
else:
curl.unsetopt(pycurl.USERPWD)
logging.info("%s %s", request.method, request.url)
_log.info("%s %s", request.method, request.url)
if request.prepare_curl_callback is not None:
request.prepare_curl_callback(curl)

Expand All @@ -434,7 +435,7 @@ def _curl_header_callback(headers, header_line):
return
parts = header_line.split(": ")
if len(parts) != 2:
logging.warning("Invalid HTTP response header line %r", header_line)
_log.warning("Invalid HTTP response header line %r", header_line)
return
name = parts[0].strip()
value = parts[1].strip()
Expand All @@ -447,12 +448,12 @@ def _curl_header_callback(headers, header_line):
def _curl_debug(debug_type, debug_msg):
debug_types = ('I', '<', '>', '<', '>')
if debug_type == 0:
logging.debug('%s', debug_msg.strip())
_log.debug('%s', debug_msg.strip())
elif debug_type in (1, 2):
for line in debug_msg.splitlines():
logging.debug('%s %s', debug_types[debug_type], line)
_log.debug('%s %s', debug_types[debug_type], line)
elif debug_type == 4:
logging.debug('%s %r', debug_types[debug_type], debug_msg)
_log.debug('%s %r', debug_types[debug_type], debug_msg)


def _utf8(value):
Expand Down
24 changes: 16 additions & 8 deletions tornado/httpserver.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@

import cgi
import errno
import fcntl
import functools
import ioloop
import iostream
Expand All @@ -28,11 +27,20 @@
import time
import urlparse

try:
import fcntl
except ImportError:
if os.name == 'nt':
import win32_support as fcntl
else:
raise

try:
import ssl # Python 2.6+
except ImportError:
ssl = None

_log = logging.getLogger('tornado.httpserver')

class HTTPServer(object):
"""A non-blocking, single-threaded HTTP server.
Expand Down Expand Up @@ -164,16 +172,16 @@ def start(self, num_processes=None):
try:
num_processes = os.sysconf("SC_NPROCESSORS_CONF")
except ValueError:
logging.error("Could not get num processors from sysconf; "
_log.error("Could not get num processors from sysconf; "
"running with one process")
num_processes = 1
if num_processes > 1 and ioloop.IOLoop.initialized():
logging.error("Cannot run in multiple processes: IOLoop instance "
_log.error("Cannot run in multiple processes: IOLoop instance "
"has already been initialized. You cannot call "
"IOLoop.instance() before calling start()")
num_processes = 1
if num_processes > 1:
logging.info("Pre-forking %d server processes", num_processes)
_log.info("Pre-forking %d server processes", num_processes)
for i in range(num_processes):
if os.fork() == 0:
self.io_loop = ioloop.IOLoop.instance()
Expand Down Expand Up @@ -210,7 +218,7 @@ def _handle_events(self, fd, events):
HTTPConnection(stream, address, self.request_callback,
self.no_keep_alive, self.xheaders)
except:
logging.error("Error in connection callback", exc_info=True)
_log.error("Error in connection callback", exc_info=True)


class HTTPConnection(object):
Expand Down Expand Up @@ -313,21 +321,21 @@ def _parse_mime_body(self, boundary, data):
if not part: continue
eoh = part.find("\r\n\r\n")
if eoh == -1:
logging.warning("multipart/form-data missing headers")
_log.warning("multipart/form-data missing headers")
continue
headers = HTTPHeaders.parse(part[:eoh])
name_header = headers.get("Content-Disposition", "")
if not name_header.startswith("form-data;") or \
not part.endswith("\r\n"):
logging.warning("Invalid multipart/form-data")
_log.warning("Invalid multipart/form-data")
continue
value = part[eoh + 4:-2]
name_values = {}
for name_part in name_header[10:].split(";"):
name, name_value = name_part.strip().split("=", 1)
name_values[name] = name_value.strip('"').decode("utf-8")
if not name_values.get("name"):
logging.warning("multipart/form-data value missing name")
_log.warning("multipart/form-data value missing name")
continue
name = name_values["name"]
if name_values.get("filename"):
Expand Down
49 changes: 33 additions & 16 deletions tornado/ioloop.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,12 +18,21 @@

import bisect
import errno
import fcntl
import logging
import os
import logging
import select
import time

try:
import fcntl
except ImportError:
if os.name == 'nt':
import win32_support
import win32_support as fcntl
else:
raise

_log = logging.getLogger("tornado.ioloop")

class IOLoop(object):
"""A level-triggered I/O loop.
Expand Down Expand Up @@ -92,13 +101,17 @@ def __init__(self, impl=None):

# Create a pipe that we send bogus data to when we want to wake
# the I/O loop when it is idle
r, w = os.pipe()
self._set_nonblocking(r)
self._set_nonblocking(w)
self._set_close_exec(r)
self._set_close_exec(w)
self._waker_reader = os.fdopen(r, "r", 0)
self._waker_writer = os.fdopen(w, "w", 0)
if os.name != 'nt':
r, w = os.pipe()
self._set_nonblocking(r)
self._set_nonblocking(w)
self._set_close_exec(r)
self._set_close_exec(w)
self._waker_reader = os.fdopen(r, "r", 0)
self._waker_writer = os.fdopen(w, "w", 0)
else:
self._waker_reader = self._waker_writer = win32_support.Pipe()
r = self._waker_writer.reader_fd
self.add_handler(r, self._read_waker, self.READ)

@classmethod
Expand Down Expand Up @@ -141,7 +154,7 @@ def remove_handler(self, fd):
try:
self._impl.unregister(fd)
except (OSError, IOError):
logging.debug("Error deleting fd from IOLoop", exc_info=True)
_log.debug("Error deleting fd from IOLoop", exc_info=True)

def start(self):
"""Starts the I/O loop.
Expand Down Expand Up @@ -185,7 +198,7 @@ def start(self):
event_pairs = self._impl.poll(poll_timeout)
except Exception, e:
if e.errno == errno.EINTR:
logging.warning("Interrupted system call", exc_info=1)
_log.warning("Interrupted system call", exc_info=1)
continue
else:
raise
Expand All @@ -206,10 +219,10 @@ def start(self):
# Happens when the client closes the connection
pass
else:
logging.error("Exception in I/O handler for fd %d",
_log.error("Exception in I/O handler for fd %d",
fd, exc_info=True)
except:
logging.error("Exception in I/O handler for fd %d",
_log.error("Exception in I/O handler for fd %d",
fd, exc_info=True)
# reset the stopped flag so another start/stop pair can be issued
self._stopped = False
Expand Down Expand Up @@ -277,7 +290,7 @@ def handle_callback_exception(self, callback):
The exception itself is not passed explicitly, but is available
in sys.exc_info.
"""
logging.error("Exception in callback %r", callback, exc_info=True)
_log.error("Exception in callback %r", callback, exc_info=True)

def _read_waker(self, fd, events):
try:
Expand All @@ -297,6 +310,10 @@ def _set_close_exec(self, fd):

class _Timeout(object):
"""An IOLoop timeout, a UNIX timestamp and a callback"""

# Reduce memory overhead when there are lots of pending callbacks
__slots__ = ['deadline', 'callback']

def __init__(self, deadline, callback):
self.deadline = deadline
self.callback = callback
Expand Down Expand Up @@ -331,7 +348,7 @@ def _run(self):
except (KeyboardInterrupt, SystemExit):
raise
except:
logging.error("Error in periodic callback", exc_info=True)
_log.error("Error in periodic callback", exc_info=True)
self.start()


Expand Down Expand Up @@ -462,5 +479,5 @@ def poll(self, timeout):
# All other systems
import sys
if "linux" in sys.platform:
logging.warning("epoll module not found; using select()")
_log.warning("epoll module not found; using select()")
_poll = _Select
Loading

0 comments on commit 7b4ef60

Please sign in to comment.