Skip to content

Commit

Permalink
Merge pull request #1 from mSOHU/0.2.2
Browse files Browse the repository at this point in the history
fix tornado2 related issue
  • Loading branch information
leohowell committed Mar 9, 2016
2 parents 7210f61 + 6887eab commit 5b8e9cf
Show file tree
Hide file tree
Showing 4 changed files with 72 additions and 32 deletions.
19 changes: 19 additions & 0 deletions http2/__init__.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,24 @@
# -*- coding: utf-8 -*-

import sys

__version__ = '0.2.2'


# patch struct.unpack to accept memoryview object
# for python < 2.7.5
if sys.version < (2, 7, 5):
import struct
_unpack = struct.unpack

def unpack(fmt, data):
if isinstance(data, memoryview):
return _unpack(fmt, data.tobytes())
else:
return _unpack(fmt, data)
struct.unpack = unpack


try:
from tornado import version_info
except ImportError:
Expand Down
36 changes: 20 additions & 16 deletions http2/tornado2.py
Original file line number Diff line number Diff line change
Expand Up @@ -232,6 +232,7 @@ def _on_connection_close(self, io_stream, reason):
if connection is not None:
connection.on_connection_close(io_stream.error)

# schedule back-off
self.connection_backoff = min(
self.connection_backoff + 1, self.MAX_CONNECTION_BACKOFF)
now_time = time.time()
Expand All @@ -241,12 +242,12 @@ def _on_connection_close(self, io_stream, reason):

if io_stream is None:
logger.info(
'Connection to %s failed due: %r. Reconnect in %.2f seconds',
self.host, reason, self.next_connect_time - now_time)
'Connection to %s:%u failed due: %r. Reconnect in %.2f seconds',
self.host, self.port, reason, self.next_connect_time - now_time)
else:
logger.info(
'Connection closed due: %r. Reconnect in %.2f seconds',
reason, self.next_connect_time - now_time)
'Connection to %s:%u closed due: %r. Reconnect in %.2f seconds',
self.host, self.port, reason, self.next_connect_time - now_time)

self.io_loop.add_timeout(
self.next_connect_time, functools.partial(
Expand All @@ -262,10 +263,10 @@ def _on_connection_close(self, io_stream, reason):

def _connection_terminated(self, event):
self._on_connection_close(
'Server requested: ERR 0x%x' % event.error_code, self.io_stream)
self.io_stream, 'Server requested, code: 0x%x' % event.error_code)

def _on_connection_ready(self, io_stream):
# back-off
# reset back-off
self.next_connect_time = max(time.time(), self.next_connect_time)
self.connection_backoff = 0

Expand Down Expand Up @@ -448,9 +449,10 @@ def _get_ssl_options(cls, cert_options):
return ssl_options

def _on_connect(self, io_stream, ready_callback, close_callback):
if not self._verify_cert(io_stream.socket.getpeercert()):
io_stream.close()
return
if self.secure:
if not self._verify_cert(io_stream.socket.getpeercert()):
io_stream.close()
return

io_stream.set_close_callback(lambda: close_callback(io_stream, io_stream.error))
self.io_loop.add_callback(functools.partial(ready_callback, io_stream))
Expand Down Expand Up @@ -519,22 +521,24 @@ def _on_connection_streaming(self, data):

try:
events = self.h2_conn.receive_data(data)
except h2.exceptions.ProtocolError as err:
except Exception as err:
try:
self._flush_to_stream()
finally:
if isinstance(err, h2.exceptions.ProtocolError):
self._flush_to_stream()
self.io_stream.close()
finally:
self.on_connection_close(err)
return

if events:
try:
self._process_events(events)
except Exception as err:
self.io_stream.close()
self.on_connection_close(err)
else:
self._flush_to_stream()
except Exception as err:
try:
self.io_stream.close()
finally:
self.on_connection_close(err)

def _flush_to_stream(self):
"""flush h2 connection data to IOStream"""
Expand Down
31 changes: 16 additions & 15 deletions http2/tornado4.py
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,7 @@ def _on_connection_close(self, io_stream, reason):
if connection is not None:
connection.on_connection_close(io_stream.error)

# schedule back-off
self.connection_backoff = min(
self.connection_backoff + 1, self.MAX_CONNECTION_BACKOFF)
now_time = time.time()
Expand All @@ -138,12 +139,12 @@ def _on_connection_close(self, io_stream, reason):

if io_stream is None:
logger.info(
'Connection to %s failed due: %r. Reconnect in %.2f seconds',
self.host, reason, self.next_connect_time - now_time)
'Connection to %s:%u failed due: %r. Reconnect in %.2f seconds',
self.host, self.port, reason, self.next_connect_time - now_time)
else:
logger.info(
'Connection closed due: %r. Reconnect in %.2f seconds',
reason, self.next_connect_time - now_time)
'Connection to %s:%u closed due: %r. Reconnect in %.2f seconds',
self.host, self.port, reason, self.next_connect_time - now_time)

self.io_loop.add_timeout(
self.next_connect_time, functools.partial(
Expand All @@ -159,10 +160,10 @@ def _on_connection_close(self, io_stream, reason):

def _connection_terminated(self, event):
self._on_connection_close(
'Server requested: ERR 0x%x' % event.error_code, self.io_stream)
self.io_stream, 'Server requested, code: 0x%x' % event.error_code)

def _on_connection_ready(self, io_stream):
# back-off
# reset back-off
self.next_connect_time = max(time.time(), self.next_connect_time)
self.connection_backoff = 0

Expand Down Expand Up @@ -319,24 +320,24 @@ def _on_connection_streaming(self, data):

try:
events = self.h2_conn.receive_data(data)
except h2.exceptions.ProtocolError as err:
except Exception as err:
try:
self._flush_to_stream()
if isinstance(err, h2.exceptions.ProtocolError):
self._flush_to_stream()
self.io_stream.close()
finally:
# import traceback; traceback.print_exc()
self.io_stream.close(exc_info=True)
self.on_connection_close(err)
return

if events:
try:
self._process_events(events)
except Exception as err:
# import traceback; traceback.print_exc()
self.io_stream.close(exc_info=True)
self.on_connection_close(err)
else:
self._flush_to_stream()
except Exception as err:
try:
self.io_stream.close()
finally:
self.on_connection_close(err)

def _flush_to_stream(self):
"""flush h2 connection data to IOStream"""
Expand Down
18 changes: 17 additions & 1 deletion setup.py
Original file line number Diff line number Diff line change
@@ -1,14 +1,29 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import re


try:
from setuptools import setup
except ImportError:
from distutils.core import setup


# Get the version
version_regex = r'__version__ = ["\']([^"\']*)["\']'
with open('http2/__init__.py', 'r') as f:
text = f.read()
match = re.search(version_regex, text)

if match:
version = match.group(1)
else:
raise RuntimeError("No version number found!")

setup(
name='http2',
version='0.2.1',
version=version,
description="HTTP/2 client with hyper-h2 for tornado",
author="boyxuper",
author_email='[email protected]',
Expand All @@ -22,6 +37,7 @@
install_requires=[
'h2>=2.1.0',
'tornado>=2.4.1',
'backports.ssl_match_hostname',
],
license="Apache Software License",
zip_safe=False,
Expand Down

0 comments on commit 5b8e9cf

Please sign in to comment.