Hello community,
here is the log from the commit of package python-stomp.py for openSUSE:Factory
checked in at 2019-04-30 12:59:56
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-stomp.py (Old)
and /work/SRC/openSUSE:Factory/.python-stomp.py.new.5536 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-stomp.py"
Tue Apr 30 12:59:56 2019 rev:4 rq:697387 version:4.1.22
Changes:
--------
--- /work/SRC/openSUSE:Factory/python-stomp.py/python-stomp.py.changes
2018-12-24 11:44:54.633264986 +0100
+++
/work/SRC/openSUSE:Factory/.python-stomp.py.new.5536/python-stomp.py.changes
2019-04-30 12:59:59.506177884 +0200
@@ -1,0 +2,14 @@
+Thu Apr 18 16:12:05 UTC 2019 - Marketa Calabkova <[email protected]>
+
+- update to version 4.1.22
+ * Infinite retry attempts
+ * Terminate heartbeat thread on shutdown
+ * Remove unused wait_on_receipt parameter
+ * Reduce verbosity in logging to not include headers unless debug
+ level is turned on (potential security issue)
+ * Fix for disconnect receipt usage in transport
+ * Add __enter__/__exit__ to Connection so it can be used as a
+ context
+ * Additional ssl options
+
+-------------------------------------------------------------------
Old:
----
stomp.py-4.1.21.tar.gz
New:
----
stomp.py-4.1.22.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python-stomp.py.spec ++++++
--- /var/tmp/diff_new_pack.NbGD70/_old 2019-04-30 13:00:00.530177656 +0200
+++ /var/tmp/diff_new_pack.NbGD70/_new 2019-04-30 13:00:00.530177656 +0200
@@ -1,7 +1,7 @@
#
# spec file for package python-stomp.py
#
-# Copyright (c) 2018 SUSE LINUX GmbH, Nuernberg, Germany.
+# Copyright (c) 2019 SUSE LINUX GmbH, Nuernberg, Germany.
#
# All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed
@@ -18,7 +18,7 @@
%{?!python_module:%define python_module() python-%{**} python3-%{**}}
Name: python-stomp.py
-Version: 4.1.21
+Version: 4.1.22
Release: 0
Summary: Python STOMP client
License: Apache-2.0
++++++ stomp.py-4.1.21.tar.gz -> stomp.py-4.1.22.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/stomp.py-4.1.21/CHANGELOG
new/stomp.py-4.1.22/CHANGELOG
--- old/stomp.py-4.1.21/CHANGELOG 2018-07-07 10:12:06.000000000 +0200
+++ new/stomp.py-4.1.22/CHANGELOG 2019-04-13 15:01:40.000000000 +0200
@@ -1,4 +1,15 @@
-Version 4.1.21 -
+Version 4.1.22 - Apr 2019
+
+ * Infinite retry attempts (https://github.com/jasonrbriggs/stomp.py/pull/235)
+ * Terminate heartbeat thread on shutdown
(https://github.com/jasonrbriggs/stomp.py/pull/234)
+ * Remove unused wait_on_receipt parameter
(https://github.com/jasonrbriggs/stomp.py/pull/237)
+ * Reduce verbosity in logging to not include headers unless debug level is
turned on (potential security issue as per:
https://github.com/jasonrbriggs/stomp.py/issues/226)
+ * Fix for disconnect receipt usage in transport
(https://github.com/jasonrbriggs/stomp.py/issues/212)
+ * Add __enter__/__exit__ to Connection so it can be used as a context
(https://github.com/jasonrbriggs/stomp.py/issues/215)
+ * Additional ssl options (https://github.com/jasonrbriggs/stomp.py/pull/221/)
+
+
+Version 4.1.21 - July 2018
* Fix for deadlock issue (https://github.com/jasonrbriggs/stomp.py/issues/197)
* Fix for encoding issue (https://github.com/jasonrbriggs/stomp.py/issues/195)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/stomp.py-4.1.21/PKG-INFO new/stomp.py-4.1.22/PKG-INFO
--- old/stomp.py-4.1.21/PKG-INFO 2018-07-07 10:14:14.000000000 +0200
+++ new/stomp.py-4.1.22/PKG-INFO 2019-04-13 15:02:15.000000000 +0200
@@ -1,6 +1,6 @@
Metadata-Version: 1.1
Name: stomp.py
-Version: 4.1.21
+Version: 4.1.22
Summary: Python STOMP client, supporting versions 1.0, 1.1 and 1.2 of the
protocol
Home-page: https://github.com/jasonrbriggs/stomp.py
Author: Jason R Briggs
@@ -88,7 +88,7 @@
.. _JBossMessaging: http://www.jboss.org/jbossmessaging
- For more info on setting up a test server (using virtualbox), contact
the developer.
+ For more info on setting up a local test server (using docker),
contact the developer.
Platform: any
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/stomp.py-4.1.21/README.rst
new/stomp.py-4.1.22/README.rst
--- old/stomp.py-4.1.21/README.rst 2018-06-29 13:37:36.000000000 +0200
+++ new/stomp.py-4.1.22/README.rst 2019-04-13 15:01:40.000000000 +0200
@@ -80,5 +80,5 @@
.. _JBossMessaging: http://www.jboss.org/jbossmessaging
-For more info on setting up a test server (using virtualbox), contact the
developer.
+For more info on setting up a local test server (using docker), contact the
developer.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/stomp.py-4.1.21/stomp/__init__.py
new/stomp.py-4.1.22/stomp/__init__.py
--- old/stomp.py-4.1.21/stomp/__init__.py 2018-06-29 13:37:36.000000000
+0200
+++ new/stomp.py-4.1.22/stomp/__init__.py 2018-12-18 19:41:10.000000000
+0100
@@ -11,8 +11,9 @@
import stomp.connect as connect
import stomp.listener as listener
+import stomp.adapter as adapter
-__version__ = (4, 1, 21)
+__version__ = (4, 1, 22)
##
# Alias for STOMP 1.0 connections.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/stomp.py-4.1.21/stomp/__main__.py
new/stomp.py-4.1.22/stomp/__main__.py
--- old/stomp.py-4.1.21/stomp/__main__.py 2018-06-29 13:37:36.000000000
+0200
+++ new/stomp.py-4.1.22/stomp/__main__.py 2018-12-20 00:12:36.000000000
+0100
@@ -4,25 +4,28 @@
Usage: stomp [options]
Options:
- --version Show the version number and exit
- -h, --help Show this help message and exit
- -H <host>, --host=<port> Hostname or IP address to connect to. [default:
localhost]
- -P <port>, --port=<port> Port providing stomp protocol connections.
[default: 61613]
- -U <user>, --user=<user> Username for the connection
+ --version Show the version number and exit
+ -h, --help Show this help message and exit
+ -H <host>, --host=<port> Hostname or IP address to connect to. [default:
localhost]
+ -P <port>, --port=<port> Port providing stomp protocol connections.
[default: 61613]
+ -U <user>, --user=<user> Username for the connection
-W <password>, --password=<password>
- Password for the connection
+ Password for the connection
-F <filename>, --file=<filename>
- File containing commands to be executed, instead of
- prompting from the command prompt.
+ File containing commands to be executed,
instead of
+ prompting from the command prompt.
-S <protocol version>, --protocol=<protocol version>
- Set the STOMP protocol version (1.0, 1.1, 1.2)
[default: 1.1]
- -L <queue>, --listen=<queue>
- Listen for messages on a queue/destination
- -V, --verbose Verbose logging "on" or "off" (if on, full headers
- from stomp server responses are printed)
- --ssl Enable SSL connection
- --heartbeats=<heartbeats> Heartbeats to request when connecting with
protocol >=
- 1.1 (two comma separated integers required)
[default: 0,0]
+ Set the STOMP protocol version (1.0, 1.1, 1.2)
[default: 1.1]
+ -L <queue>, --listen=<queue> Listen for messages on a queue/destination
+ -V, --verbose Verbose logging "on" or "off" (if on, full
headers
+ from stomp server responses are printed)
+ --heartbeats=<heartbeats> Heartbeats to request when connecting with
protocol >=
+ 1.1 (two comma separated integers required)
[default: 0,0]
+ --ssl Enable SSL connection
+ --ssl-key-file=<key-file> ssl key file
+ --ssl-cert-file=<cert-file> ssl cert file
+ --ssl-ca-file=<ca-file> ssl ca certs file
+
"""
import base64
@@ -36,8 +39,10 @@
from docopt import docopt
+sys.path.append(os.path.dirname(os.path.dirname(os.path.realpath(__file__))))
from stomp.adapter.multicast import MulticastConnection
import stomp.colors
+import stomp.utils
from stomp.connect import StompConnection10, StompConnection11,
StompConnection12
from stomp.listener import ConnectionListener, StatsListener
@@ -48,11 +53,6 @@
heartbeat_pattern = re.compile(r'[0-9]+,[0-9]+')
-try:
- import uuid
-except ImportError:
- from backward import uuid
-
class SubscriptionInfo(object):
"""
@@ -69,7 +69,7 @@
for more information on establishing a connection to a stomp server.
"""
def __init__(self, host='localhost', port=61613, user='', passcode='',
ver='1.1', prompt='> ', verbose=True,
- use_ssl=False, heartbeats=(0, 0), stdin=sys.stdin,
stdout=sys.stdout):
+ heartbeats=(0, 0), use_ssl=False, ssl_key_file=None,
ssl_cert_file=None, ssl_ca_file=None, stdin=sys.stdin, stdout=sys.stdout):
Cmd.__init__(self, 'Tab', stdin, stdout)
ConnectionListener.__init__(self)
self.__start = True
@@ -89,7 +89,7 @@
else:
raise RuntimeError('Unknown version')
if use_ssl:
- self.conn.set_ssl([(host, port)])
+ self.conn.set_ssl([(host, port)], key_file=ssl_key_file,
cert_file=ssl_cert_file, ca_certs=ssl_ca_file)
self.conn.set_listener('', self)
self.conn.start()
self.conn.connect(self.user, self.passcode, wait=True)
@@ -311,7 +311,7 @@
def do_sendrec(self, args):
args = args.split()
- receipt_id = str(uuid.uuid4())
+ receipt_id = stomp.utils.get_uuid()
if len(args) < 2:
self.__error('Expecting: sendrec <destination> <message>')
elif not self.transaction_id:
@@ -530,7 +530,11 @@
heartbeats = tuple(map(int, arguments['--heartbeats'].split(",")))
st = StompCLI(arguments['--host'], arguments['--port'],
arguments['--user'], arguments['--password'], arguments['--protocol'],
- prompt, arguments['--verbose'], arguments['--ssl'], heartbeats)
+ prompt, arguments['--verbose'], heartbeats=heartbeats,
+ use_ssl=arguments['--ssl'],
+ ssl_key_file=arguments['--ssl-key-file'],
+ ssl_cert_file=arguments['--ssl-cert-file'],
+ ssl_ca_file=arguments['--ssl-ca-file'])
if arguments['--listen'] is not None:
st.do_subscribe(arguments['--listen'])
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/stomp.py-4.1.21/stomp/connect.py
new/stomp.py-4.1.22/stomp/connect.py
--- old/stomp.py-4.1.21/stomp/connect.py 2018-06-30 11:50:26.000000000
+0200
+++ new/stomp.py-4.1.22/stomp/connect.py 2019-04-13 15:01:40.000000000
+0200
@@ -8,6 +8,7 @@
from stomp.listener import *
from stomp.protocol import *
from stomp.transport import *
+from stomp.utils import get_uuid
class BaseConnection(Publisher):
@@ -21,6 +22,17 @@
"""
self.transport = transport
+ def __enter__(self):
+ self.disconnect_receipt_id = get_uuid()
+ self.disconnect_listener = WaitingListener(self.disconnect_receipt_id)
+ self.set_listener('ZZZZZ-disconnect-listener',
self.disconnect_listener)
+ return self
+
+ def __exit__(self, exc_type, exc_val, exc_tb):
+ self.disconnect(self.disconnect_receipt_id)
+ self.disconnect_listener.wait_on_receipt()
+ self.disconnect_listener.wait_on_disconnected()
+
def set_listener(self, name, lstnr):
"""
:param str name:
@@ -89,7 +101,6 @@
ssl_cert_file=None,
ssl_ca_certs=None,
ssl_cert_validator=None,
- wait_on_receipt=False,
ssl_version=DEFAULT_SSL_VERSION,
timeout=None,
keepalive=None,
@@ -100,7 +111,7 @@
transport = Transport(host_and_ports, prefer_localhost,
try_loopback_connect,
reconnect_sleep_initial,
reconnect_sleep_increase, reconnect_sleep_jitter,
reconnect_sleep_max, reconnect_attempts_max,
use_ssl, ssl_key_file, ssl_cert_file,
- ssl_ca_certs, ssl_cert_validator,
wait_on_receipt, ssl_version, timeout,
+ ssl_ca_certs, ssl_cert_validator, ssl_version,
timeout,
keepalive, None, auto_decode, encoding)
BaseConnection.__init__(self, transport)
Protocol10.__init__(self, transport, auto_content_length)
@@ -140,7 +151,6 @@
ssl_cert_file=None,
ssl_ca_certs=None,
ssl_cert_validator=None,
- wait_on_receipt=False,
ssl_version=DEFAULT_SSL_VERSION,
timeout=None,
heartbeats=(0, 0),
@@ -154,7 +164,7 @@
transport = Transport(host_and_ports, prefer_localhost,
try_loopback_connect,
reconnect_sleep_initial,
reconnect_sleep_increase, reconnect_sleep_jitter,
reconnect_sleep_max, reconnect_attempts_max,
use_ssl, ssl_key_file, ssl_cert_file,
- ssl_ca_certs, ssl_cert_validator,
wait_on_receipt, ssl_version, timeout,
+ ssl_ca_certs, ssl_cert_validator, ssl_version,
timeout,
keepalive, vhost, auto_decode, encoding)
BaseConnection.__init__(self, transport)
Protocol11.__init__(self, transport, heartbeats, auto_content_length,
heart_beat_receive_scale=heart_beat_receive_scale)
@@ -194,7 +204,6 @@
ssl_cert_file=None,
ssl_ca_certs=None,
ssl_cert_validator=None,
- wait_on_receipt=False,
ssl_version=DEFAULT_SSL_VERSION,
timeout=None,
heartbeats=(0, 0),
@@ -208,7 +217,7 @@
transport = Transport(host_and_ports, prefer_localhost,
try_loopback_connect,
reconnect_sleep_initial,
reconnect_sleep_increase, reconnect_sleep_jitter,
reconnect_sleep_max, reconnect_attempts_max,
use_ssl, ssl_key_file, ssl_cert_file,
- ssl_ca_certs, ssl_cert_validator,
wait_on_receipt, ssl_version, timeout,
+ ssl_ca_certs, ssl_cert_validator, ssl_version,
timeout,
keepalive, vhost, auto_decode, encoding)
BaseConnection.__init__(self, transport)
Protocol12.__init__(self, transport, heartbeats, auto_content_length,
heart_beat_receive_scale=heart_beat_receive_scale)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/stomp.py-4.1.21/stomp/listener.py
new/stomp.py-4.1.22/stomp/listener.py
--- old/stomp.py-4.1.21/stomp/listener.py 2018-06-30 11:50:26.000000000
+0200
+++ new/stomp.py-4.1.22/stomp/listener.py 2019-04-13 11:06:09.000000000
+0200
@@ -162,6 +162,7 @@
self.received_heartbeat = None
self.heartbeat_thread = None
self.next_outbound_heartbeat = None
+ self.heartbeat_terminate_event = threading.Event()
def on_connected(self, headers, body):
"""
@@ -195,6 +196,7 @@
def on_disconnected(self):
self.running = False
+ self.heartbeat_terminate_event.set()
def on_message(self, headers, body):
"""
@@ -249,6 +251,7 @@
"""
Main loop for sending (and monitoring received) heartbeats.
"""
+ log.info('Starting heartbeat loop')
now = monotonic()
# Setup the initial due time for the outbound heartbeat
@@ -267,7 +270,9 @@
next_events.append(t)
sleep_time = min(next_events)
if sleep_time > 0:
- time.sleep(sleep_time)
+ terminate = self.heartbeat_terminate_event.wait(sleep_time)
+ if terminate:
+ break
now = monotonic()
@@ -298,6 +303,7 @@
for listener in self.transport.listeners.values():
listener.on_heartbeat_timeout()
self.heartbeat_thread = None
+ log.info('Heartbeat loop ended')
class WaitingListener(ConnectionListener):
@@ -308,9 +314,11 @@
"""
:param str receipt:
"""
- self.condition = threading.Condition()
+ self.receipt_condition = threading.Condition()
+ self.disconnect_condition = threading.Condition()
self.receipt = receipt
self.received = False
+ self.disconnected = False
def on_receipt(self, headers, body):
"""
@@ -320,19 +328,31 @@
:param body: the message content
"""
if 'receipt-id' in headers and headers['receipt-id'] == self.receipt:
- with self.condition:
+ with self.receipt_condition:
self.received = True
- self.condition.notify()
+ self.receipt_condition.notify()
+
+ def on_disconnected(self):
+ with self.disconnect_condition:
+ self.disconnected = True
+ self.disconnect_condition.notify()
def wait_on_receipt(self):
"""
Wait until we receive a message receipt.
"""
- with self.condition:
+ with self.receipt_condition:
while not self.received:
- self.condition.wait()
+ self.receipt_condition.wait()
self.received = False
+ def wait_on_disconnected(self):
+ """
+ Wait until disconnected.
+ """
+ with self.disconnect_condition:
+ while not self.disconnected:
+ self.disconnect_condition.wait()
class StatsListener(ConnectionListener):
"""
@@ -368,7 +388,10 @@
:param dict headers: headers in the message
:param body: the message content
"""
- log.info("received an error %s [%s]", body, headers)
+ if log.isEnabledFor(logging.DEBUG):
+ log.debug("received an error %s [%s]", body, headers)
+ else:
+ log.info("received an error %s", body)
self.errors += 1
def on_connecting(self, host_and_port):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/stomp.py-4.1.21/stomp/protocol.py
new/stomp.py-4.1.22/stomp/protocol.py
--- old/stomp.py-4.1.21/stomp/protocol.py 2018-06-30 11:50:26.000000000
+0200
+++ new/stomp.py-4.1.22/stomp/protocol.py 2018-12-19 20:39:06.000000000
+0100
@@ -1,8 +1,6 @@
"""Provides the 1.0, 1.1 and 1.2 protocol classes.
"""
-import uuid
-
from stomp.constants import *
from stomp.exception import ConnectFailedException
from stomp.listener import *
@@ -81,7 +79,7 @@
"""
headers = utils.merge_headers([headers, keyword_headers])
if not transaction:
- transaction = str(uuid.uuid4())
+ transaction = utils.get_uuid()
headers[HDR_TRANSACTION] = transaction
self.send_frame(CMD_BEGIN, headers)
return transaction
@@ -140,7 +138,7 @@
log.debug('Not sending disconnect, already disconnected')
return
headers = utils.merge_headers([headers, keyword_headers])
- rec = receipt or str(uuid.uuid4())
+ rec = receipt or utils.get_uuid()
headers[HDR_RECEIPT] = rec
self.set_receipt(rec, CMD_DISCONNECT)
self.send_frame(CMD_DISCONNECT, headers)
@@ -293,7 +291,7 @@
"""
headers = utils.merge_headers([headers, keyword_headers])
if not transaction:
- transaction = str(uuid.uuid4())
+ transaction = utils.get_uuid()
headers[HDR_TRANSACTION] = transaction
self.send_frame(CMD_BEGIN, headers)
return transaction
@@ -355,7 +353,7 @@
log.debug('Not sending disconnect, already disconnected')
return
headers = utils.merge_headers([headers, keyword_headers])
- rec = receipt or str(uuid.uuid4())
+ rec = receipt or utils.get_uuid()
headers[HDR_RECEIPT] = rec
self.set_receipt(rec, CMD_DISCONNECT)
self.send_frame(CMD_DISCONNECT, headers)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/stomp.py-4.1.21/stomp/test/__init__.py
new/stomp.py-4.1.22/stomp/test/__init__.py
--- old/stomp.py-4.1.21/stomp/test/__init__.py 2018-06-30 11:50:26.000000000
+0200
+++ new/stomp.py-4.1.22/stomp/test/__init__.py 2018-12-18 19:41:10.000000000
+0100
@@ -1,7 +1,7 @@
import sys
__all__ = ['basic_test', 'nonascii_test', 'ss_test', 'cli_test',
'cli_ssl_test', 's10_test',
- 's11_test', 's12_test', 'rabbitmq_test', 'stompserver_test',
+ 's11_test', 's12_test', 'activemq_test', 'rabbitmq_test',
'stompserver_test',
'misc_test', 'multicast_test', 'ssl_test', 'utils_test',
'transport_test', 'local_test']
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/stomp.py-4.1.21/stomp/test/activemq_test.py
new/stomp.py-4.1.22/stomp/test/activemq_test.py
--- old/stomp.py-4.1.21/stomp/test/activemq_test.py 1970-01-01
01:00:00.000000000 +0100
+++ new/stomp.py-4.1.22/stomp/test/activemq_test.py 2018-12-23
01:04:25.000000000 +0100
@@ -0,0 +1,29 @@
+import unittest
+
+import stomp
+from stomp.listener import TestListener
+from stomp.test.testutils import *
+
+
+class TestRabbitMQSend(unittest.TestCase):
+
+ def setUp(self):
+ pass
+
+ def testbasic(self):
+ conn = stomp.Connection11(get_default_host())
+ listener = TestListener('123')
+ conn.set_listener('', listener)
+ conn.connect(get_default_user(), get_default_password(), wait=True)
+ conn.subscribe(destination='/queue/test', id=1, ack='auto')
+
+ conn.send(body='this is a test', destination='/queue/test',
receipt='123')
+
+ listener.wait_on_receipt()
+ listener.wait_for_message()
+
+ conn.disconnect(receipt=None)
+
+ self.assertTrue(listener.connections == 1, 'should have received 1
connection acknowledgement')
+ self.assertTrue(listener.messages == 1, 'should have received 1
message')
+ self.assertTrue(listener.errors == 0, 'should not have received any
errors')
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/stomp.py-4.1.21/stomp/test/apollo_test.py
new/stomp.py-4.1.22/stomp/test/apollo_test.py
--- old/stomp.py-4.1.21/stomp/test/apollo_test.py 1970-01-01
01:00:00.000000000 +0100
+++ new/stomp.py-4.1.22/stomp/test/apollo_test.py 2019-04-13
15:01:40.000000000 +0200
@@ -0,0 +1,24 @@
+import unittest
+
+import stomp
+from stomp.listener import WaitingListener
+from stomp.test.testutils import *
+
+
+class TestApolloSend(unittest.TestCase):
+
+ def setUp(self):
+ pass
+
+ def testbasic(self):
+ conn = stomp.Connection11(get_apollo_host())
+ listener = WaitingListener('123')
+ conn.set_listener('', listener)
+ conn.connect(get_default_user(), get_default_password(), wait=True)
+ conn.subscribe(destination='/queue/test', id=1, ack='auto')
+
+ conn.send(body='this is a test', destination='/queue/test',
receipt='123')
+
+ listener.wait_on_receipt()
+
+ conn.disconnect(receipt=None)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/stomp.py-4.1.21/stomp/test/basic_test.py
new/stomp.py-4.1.22/stomp/test/basic_test.py
--- old/stomp.py-4.1.21/stomp/test/basic_test.py 2018-06-29
13:37:36.000000000 +0200
+++ new/stomp.py-4.1.22/stomp/test/basic_test.py 2018-12-19
20:52:44.000000000 +0100
@@ -190,3 +190,21 @@
self.assertFalse(conn.is_connected(), 'Should not be connected')
except:
self.fail("Shouldn't happen")
+
+class TestContext(unittest.TestCase):
+ def setUp(self):
+ self.timestamp = time.strftime('%Y%m%d%H%M%S')
+
+ def test_with_context(self):
+ with stomp.Connection(get_default_host()) as conn:
+ self.listener = TestListener('123')
+ conn.set_listener('', self.listener)
+ conn.connect(get_default_user(), get_default_password(), wait=True)
+
+ queuename = '/queue/test1-%s' % self.timestamp
+ conn.subscribe(destination=queuename, id=1, ack='auto')
+ conn.send(body='this is a test', destination=queuename,
receipt='123')
+ self.listener.wait_for_message()
+
+ self.assertTrue(self.listener.connections == 1, 'should have received
1 connection acknowledgement')
+ self.assertTrue(self.listener.disconnects >= 1, 'should have received
1 disconnect')
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/stomp.py-4.1.21/stomp/test/local_test.py
new/stomp.py-4.1.22/stomp/test/local_test.py
--- old/stomp.py-4.1.21/stomp/test/local_test.py 2018-06-29
13:37:36.000000000 +0200
+++ new/stomp.py-4.1.22/stomp/test/local_test.py 2018-12-18
19:41:10.000000000 +0100
@@ -27,6 +27,7 @@
self.conn.send(body='this is a test', destination=queuename,
receipt='123')
self.listener.wait_on_receipt()
+ self.listener.wait_for_message()
self.assertTrue(self.listener.connections == 1, 'should have received
1 connection acknowledgement')
self.assertTrue(self.listener.messages == 1, 'should have received 1
message')
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/stomp.py-4.1.21/stomp/test/misc_test.py
new/stomp.py-4.1.22/stomp/test/misc_test.py
--- old/stomp.py-4.1.21/stomp/test/misc_test.py 2018-06-29 13:37:36.000000000
+0200
+++ new/stomp.py-4.1.22/stomp/test/misc_test.py 2018-12-18 19:41:10.000000000
+0100
@@ -51,10 +51,10 @@
class TestMessageTransform(unittest.TestCase):
def setUp(self):
- conn = stomp.Connection(get_default_host())
+ conn = stomp.Connection(get_rabbitmq_host())
listener = TransformationListener('123')
conn.set_listener('', listener)
- conn.connect(get_default_user(), get_default_password(), wait=True)
+ conn.connect(get_rabbitmq_user(), get_rabbitmq_password(), wait=True)
self.conn = conn
self.listener = listener
self.timestamp = time.strftime('%Y%m%d%H%M%S')
@@ -78,11 +78,12 @@
</entry>
</map>''', destination=queuename, headers={'transformation': 'jms-map-xml'},
receipt='123')
+ self.listener.wait_on_receipt()
self.listener.wait_for_message()
self.assertTrue(self.listener.message is not None, 'Did not receive a
message')
self.assertTrue(self.listener.message.__class__ == dict,
- 'Message type should be dict after transformation, was
%s' % self.listener.message.__class__)
+ 'Message type should be dict after transformation, was %s' %
self.listener.message.__class__)
self.assertTrue(self.listener.message['name'] == 'Dejan', 'Missing an
expected dict element')
self.assertTrue(self.listener.message['city'] == 'Belgrade', 'Missing
an expected dict element')
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/stomp.py-4.1.21/stomp/test/multicast_test.py
new/stomp.py-4.1.22/stomp/test/multicast_test.py
--- old/stomp.py-4.1.21/stomp/test/multicast_test.py 2018-06-30
11:50:26.000000000 +0200
+++ new/stomp.py-4.1.22/stomp/test/multicast_test.py 2019-04-13
15:01:40.000000000 +0200
@@ -1,10 +1,10 @@
import time
import unittest
-import uuid
from stomp.adapter.multicast import MulticastConnection
from stomp.listener import TestListener
from stomp.test.testutils import *
+from stomp.utils import get_uuid
class TestMulticast(unittest.TestCase):
@@ -58,7 +58,7 @@
queuename = '/queue/test1-%s' % self.timestamp
self.conn.subscribe(destination=queuename, id=1, ack='auto')
- trans_id = str(uuid.uuid4())
+ trans_id = get_uuid()
self.conn.begin(trans_id)
self.conn.send(body='this is a test', transaction=trans_id,
destination=queuename, receipt='123')
@@ -113,7 +113,4 @@
(_, msg) = self.listener.get_latest_message()
- if sys.hexversion >= 0x03000000:
- self.assertEqual(txt, msg)
- else:
- self.assertEqual(txt.encode('utf-8'), msg)
+ self.assertEqual(txt.encode('utf-8'), msg)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/stomp.py-4.1.21/stomp/test/s11_test.py
new/stomp.py-4.1.22/stomp/test/s11_test.py
--- old/stomp.py-4.1.21/stomp/test/s11_test.py 2018-06-29 13:37:36.000000000
+0200
+++ new/stomp.py-4.1.22/stomp/test/s11_test.py 2019-04-13 11:06:09.000000000
+0200
@@ -80,3 +80,37 @@
server.stop()
self.assertTrue(listener.heartbeat_timeouts >= 1, 'should have
received a heartbeat timeout')
+
+ def testheartbeat_shutdown(self):
+ server = TestStompServer('127.0.0.1', 60000)
+ server.start()
+ conn = None
+ try:
+ server.add_frame('''CONNECTED
+ version:1.1
+ session:1
+ server:test
+ heart-beat:1000,1000
+
+ \x00''')
+
+ conn = stomp.Connection([('127.0.0.1', 60000)],
heartbeats=(10000, 10000))
+ listener = TestListener()
+ conn.set_listener('', listener)
+ conn.connect()
+
+ start_time = time.time()
+ time.sleep(0.5)
+ # shutdown connection
+ server.stop()
+ while conn.heartbeat_thread is not None:
+ time.sleep(0.5)
+ end_time = time.time()
+
+ server.running = False
+ except Exception:
+ _, e, _ = sys.exc_info()
+ log.error("Error: %s", e)
+
+ self.assertLessEqual(end_time - start_time, 2, 'should stop
immediately and not after heartbeat timeout')
+ self.assertIsNone(conn.heartbeat_thread, 'heartbeat thread should
have finished')
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/stomp.py-4.1.21/stomp/test/s12_test.py
new/stomp.py-4.1.22/stomp/test/s12_test.py
--- old/stomp.py-4.1.21/stomp/test/s12_test.py 2018-06-29 13:37:36.000000000
+0200
+++ new/stomp.py-4.1.22/stomp/test/s12_test.py 2018-12-18 19:41:10.000000000
+0100
@@ -111,7 +111,8 @@
self.assertTrue('special-3' in headers)
self.assertEqual('test with newlines \n \n', headers['special-3'])
self.assertTrue('special-4' in headers)
- self.assertEqual('test with carriage return \r', headers['special-4'])
+ cr_header = headers['special-4'].replace('\\r', '\r')
+ self.assertEqual('test with carriage return \r', cr_header)
def test_suppress_content_length(self):
queuename = '/queue/testspecialchars12-%s' % self.timestamp
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/stomp.py-4.1.21/stomp/test/setup.ini
new/stomp.py-4.1.22/stomp/test/setup.ini
--- old/stomp.py-4.1.21/stomp/test/setup.ini 2018-06-30 11:50:26.000000000
+0200
+++ new/stomp.py-4.1.22/stomp/test/setup.ini 2018-12-23 00:35:35.000000000
+0100
@@ -1,24 +1,28 @@
[default]
-host = 10.0.0.20
-port = 61613
+host = 172.17.0.2
+port = 62613
ssl_port = 62614
user = admin
password = password
[ipv6]
-host = fe80::a00:27ff:fe90:3f1a%wlp58s0
+host = 2001:db8:1234:5678:9abc:242:ac11:2
port = 62613
[rabbitmq]
-host = 10.0.0.113
+host = 172.17.0.2
port = 61613
user = guest
password = guest
[stompserver]
-host = 10.0.0.113
+host = 172.17.0.2
port = 63613
[sni]
host = my.example.com
ssl_port = 65001
+
+[apollo]
+host = 172.17.0.2
+port = 64613
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/stomp.py-4.1.21/stomp/test/ssl_test.py
new/stomp.py-4.1.22/stomp/test/ssl_test.py
--- old/stomp.py-4.1.21/stomp/test/ssl_test.py 2018-06-29 13:37:36.000000000
+0200
+++ new/stomp.py-4.1.22/stomp/test/ssl_test.py 2018-12-18 19:41:10.000000000
+0100
@@ -20,12 +20,14 @@
conn = stomp.Connection(get_default_ssl_host())
conn.set_ssl(get_default_ssl_host())
conn.set_listener('', self.listener)
- conn.connect('admin', 'password', wait=True)
+ conn.connect(get_default_user(), get_default_password(), wait=True)
conn.subscribe(destination=queuename, id=1, ack='auto')
conn.send(body='this is a test', destination=queuename,
receipt='123')
self.listener.wait_on_receipt()
+ self.listener.wait_for_message()
+
conn.disconnect(receipt=None)
self.assertTrue(self.listener.connections == 1, 'should have
received 1 connection acknowledgement')
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/stomp.py-4.1.21/stomp/test/stompserver_test.py
new/stomp.py-4.1.22/stomp/test/stompserver_test.py
--- old/stomp.py-4.1.21/stomp/test/stompserver_test.py 2018-06-29
13:37:36.000000000 +0200
+++ new/stomp.py-4.1.22/stomp/test/stompserver_test.py 2018-12-18
19:41:10.000000000 +0100
@@ -20,6 +20,7 @@
conn.send(body='this is a test', destination='/queue/test',
receipt='123')
listener.wait_on_receipt()
+ listener.wait_for_message()
conn.unsubscribe('/queue/test')
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/stomp.py-4.1.21/stomp/test/testutils.py
new/stomp.py-4.1.22/stomp/test/testutils.py
--- old/stomp.py-4.1.21/stomp/test/testutils.py 2018-06-30 11:50:26.000000000
+0200
+++ new/stomp.py-4.1.22/stomp/test/testutils.py 2018-12-23 00:36:33.000000000
+0100
@@ -95,6 +95,10 @@
port = config.get('stompserver', 'port')
return [(get_environ('STOMPSERVER_HOST') or host,
int(get_environ('STOMPSERVER_PORT') or port))]
+def get_apollo_host():
+ host = config.get('apollo', 'host')
+ port = config.get('apollo', 'port')
+ return [(get_environ('APOLLO_HOST') or host,
int(get_environ('APOLLO_PORT') or port))]
class TestStompServer(object):
def __init__(self, host, port):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/stomp.py-4.1.21/stomp/transport.py
new/stomp.py-4.1.22/stomp/transport.py
--- old/stomp.py-4.1.21/stomp/transport.py 2018-06-30 12:51:09.000000000
+0200
+++ new/stomp.py-4.1.22/stomp/transport.py 2019-04-13 15:01:40.000000000
+0200
@@ -51,7 +51,6 @@
and anything else outside of actually establishing a network connection,
sending and
receiving of messages (so generally socket-agnostic functions).
- :param bool wait_on_receipt: deprecated, ignored
:param bool auto_decode: automatically decode message responses as
strings, rather than
leaving them as bytes. This preserves the behaviour as of version
4.0.16.
(To be defaulted to False as of the next release)
@@ -63,7 +62,7 @@
#
__content_length_re =
re.compile(b'^content-length[:]\\s*(?P<value>[0-9]+)', re.MULTILINE)
- def __init__(self, wait_on_receipt=False, auto_decode=True,
encoding='utf-8'):
+ def __init__(self, auto_decode=True, encoding='utf-8'):
self.__recvbuf = b''
self.listeners = {}
self.running = False
@@ -189,7 +188,7 @@
if log.isEnabledFor(logging.DEBUG):
log.debug("Received frame: %r, headers=%r, body=%r", f.cmd,
f.headers, f.body)
else:
- log.info("Received frame: %r, headers=%r, len(body)=%r",
f.cmd, f.headers, utils.length(f.body))
+ log.info("Received frame: %r, len(body)=%r", f.cmd,
utils.length(f.body))
self.notify(frame_type, f.headers, f.body)
else:
log.warning("Unknown response frame type: '%s' (frame length was
%d)", frame_type, utils.length(frame_str))
@@ -210,12 +209,12 @@
self.set_receipt(receipt, None)
self.__send_wait_condition.notify()
- # received a stomp 1.1+ disconnect receipt
- if receipt == self.__disconnect_receipt:
- self.disconnect_socket()
-
if receipt_value == CMD_DISCONNECT:
self.set_connected(False)
+ # received a stomp 1.1+ disconnect receipt
+ if receipt == self.__disconnect_receipt:
+ self.disconnect_socket()
+ self.__disconnect_receipt = None
elif frame_type == 'connected':
self.set_connected(True)
@@ -224,9 +223,9 @@
self.set_connected(False)
with self.__listeners_change_condition:
- listeners = list(self.listeners.values())
+ listeners = sorted(self.listeners.items())
- for listener in listeners:
+ for (_, listener) in listeners:
if not listener:
continue
@@ -258,9 +257,9 @@
:param Frame frame: the Frame object to transmit
"""
with self.__listeners_change_condition:
- listeners = list(self.listeners.values())
+ listeners = sorted(self.listeners.items())
- for listener in listeners:
+ for (_, listener) in listeners:
if not listener:
continue
try:
@@ -268,13 +267,16 @@
except AttributeError:
continue
+ if frame.cmd == CMD_DISCONNECT and HDR_RECEIPT in frame.headers:
+ self.__disconnect_receipt = frame.headers[HDR_RECEIPT]
+
lines = utils.convert_frame(frame)
packed_frame = pack(lines)
if log.isEnabledFor(logging.DEBUG):
log.debug("Sending frame: %s", lines)
else:
- log.info("Sending frame: %r, headers=%r", frame.cmd or
"heartbeat", utils.clean_headers(frame.headers))
+ log.info("Sending frame: %r", frame.cmd or "heartbeat")
self.send(packed_frame)
def send(self, encoded_frame):
@@ -472,7 +474,7 @@
stampeding. For example, a value of 0.1 means to wait
an extra 0%-10% (randomly determined) of the delay
calculated using the previous three parameters.
- :param int reconnect_attempts_max: maximum attempts to reconnect
+ :param int reconnect_attempts_max: maximum attempts to reconnect (Can also
be used for infinite attempts : `-1`)
:param bool use_ssl: deprecated, see :py:meth:`set_ssl`
:param ssl_cert_file: deprecated, see :py:meth:`set_ssl`
:param ssl_key_file: deprecated, see :py:meth:`set_ssl`
@@ -480,7 +482,6 @@
:param ssl_cert_validator: deprecated, see :py:meth:`set_ssl`
:param ssl_version: deprecated, see :py:meth:`set_ssl`
:param timeout: the timeout value to use when connecting the stomp socket
- :param bool wait_on_receipt: deprecated, ignored
:param keepalive: some operating systems support sending the occasional
heart
beat packets to detect when a connection fails. This
parameter can either be set set to a boolean to turn on the
@@ -505,7 +506,6 @@
ssl_cert_file=None,
ssl_ca_certs=None,
ssl_cert_validator=None,
- wait_on_receipt=False,
ssl_version=None,
timeout=None,
keepalive=None,
@@ -514,7 +514,7 @@
encoding='utf-8',
recv_bytes=1024
):
- BaseTransport.__init__(self, wait_on_receipt, auto_decode, encoding)
+ BaseTransport.__init__(self, auto_decode, encoding)
if host_and_ports is None:
host_and_ports = [('localhost', 61613)]
@@ -725,7 +725,9 @@
sleep_exp = 1
connect_count = 0
- while self.running and self.socket is None and connect_count <
self.__reconnect_attempts_max:
+ while self.running and self.socket is None and (
+ connect_count < self.__reconnect_attempts_max or
+ self.__reconnect_attempts_max == -1 ):
for host_and_port in self.__host_and_ports:
try:
log.info("Attempting connection to host %s, port %s",
host_and_port[0], host_and_port[1])
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/stomp.py-4.1.21/stomp/utils.py
new/stomp.py-4.1.22/stomp/utils.py
--- old/stomp.py-4.1.21/stomp/utils.py 2018-06-30 11:50:26.000000000 +0200
+++ new/stomp.py-4.1.22/stomp/utils.py 2018-12-19 20:39:06.000000000 +0100
@@ -9,6 +9,10 @@
from stomp.backward import encode, decode, NULL
from stomp.constants import *
+try:
+ import uuid
+except ImportError:
+ from backward import uuid
# List of all host names (unqualified, fully-qualified, and IP
# addresses) that refer to the local host (both loopback interface
@@ -271,3 +275,7 @@
def __str__(self):
return '{cmd=%s,headers=[%s],body=%s}' % (self.cmd, self.headers,
self.body)
+
+
+def get_uuid():
+ return str(uuid.uuid4())
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/stomp.py-4.1.21/stomp.py.egg-info/PKG-INFO
new/stomp.py-4.1.22/stomp.py.egg-info/PKG-INFO
--- old/stomp.py-4.1.21/stomp.py.egg-info/PKG-INFO 2018-07-07
10:14:14.000000000 +0200
+++ new/stomp.py-4.1.22/stomp.py.egg-info/PKG-INFO 2019-04-13
15:02:15.000000000 +0200
@@ -1,6 +1,6 @@
Metadata-Version: 1.1
Name: stomp.py
-Version: 4.1.21
+Version: 4.1.22
Summary: Python STOMP client, supporting versions 1.0, 1.1 and 1.2 of the
protocol
Home-page: https://github.com/jasonrbriggs/stomp.py
Author: Jason R Briggs
@@ -88,7 +88,7 @@
.. _JBossMessaging: http://www.jboss.org/jbossmessaging
- For more info on setting up a test server (using virtualbox), contact
the developer.
+ For more info on setting up a local test server (using docker),
contact the developer.
Platform: any
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/stomp.py-4.1.21/stomp.py.egg-info/SOURCES.txt
new/stomp.py-4.1.22/stomp.py.egg-info/SOURCES.txt
--- old/stomp.py-4.1.21/stomp.py.egg-info/SOURCES.txt 2018-07-07
10:14:14.000000000 +0200
+++ new/stomp.py-4.1.22/stomp.py.egg-info/SOURCES.txt 2019-04-13
15:02:15.000000000 +0200
@@ -31,6 +31,8 @@
stomp/adapter/__init__.py
stomp/adapter/multicast.py
stomp/test/__init__.py
+stomp/test/activemq_test.py
+stomp/test/apollo_test.py
stomp/test/basic_test.py
stomp/test/cli_ssl_test.py
stomp/test/cli_test.py