try:
post = util.parse_qsl(apreq.read(int(apreq.headers_in['Content-length'])))
+ osrf.log.log_debug('post = ' + str(post))
self.body = [d for d in post if d[0] == 'osrf-msg'][0][1]
- except:
+ osrf.log.log_debug(self.body)
+ except Exception, e:
+ osrf.log.log_warn("error parsing osrf message: %s" % unicode(e))
self.body = None
return
first_write = True
while not self.complete:
- net_msg = self.handle.recv(self.timeout)
+ net_msg = None
+ try:
+ net_msg = self.handle.recv(self.timeout)
+ except osrf.net.XMPPNoRecipient:
+ return apache.HTTP_NOT_FOUND
+
if not net_msg:
return apache.GATEWAY_TIME_OUT
from pyxmpp.jid import JID
from socket import gethostname
import libxml2
-import osrf.log
+import osrf.log, osrf.ex
THREAD_SESSIONS = {}
#logger.addHandler(logging.FileHandler('j.log'))
#logger.setLevel(logging.DEBUG)
+
+
+class XMPPNoRecipient(osrf.ex.OSRFException):
+ ''' Raised when a message was sent to a non-existent recipient
+ The recipient is stored in the 'recipient' field on this object
+ '''
+ def __init__(self, recipient):
+ osrf.ex.OSRFException.__init__(self, 'Error communicating with %s' % recipient)
+ self.recipient = recipient
+
def set_network_handle(handle):
""" Sets the thread-specific network handle"""
THREAD_SESSIONS[threading.currentThread().getName()] = handle
self.queue = []
self.receive_callback = None
+ self.transport_error_msg = None
def connect(self):
JabberClient.connect(self)
osrf.log.log_info("Successfully connected to the opensrf network")
self.authenticated()
self.stream.set_message_handler("normal", self.message_received)
+ self.stream.set_message_handler("error", self.error_received)
self.isconnected = True
def send(self, message):
message.sender = self.jid.as_utf8()
msg = message.make_xmpp_msg()
self.stream.send(msg)
+
+ def error_received(self, stanza):
+ self.transport_error_msg = NetworkMessage(stanza)
+ osrf.log.log_error("XMPP error message received from %s" % self.transport_error_msg.sender)
def message_received(self, stanza):
"""Handler for received messages."""
timeout -= endtime
osrf.log.log_internal("exiting stream loop after %s seconds. "
"act=%s, queue size=%d" % (str(endtime), act, len(self.queue)))
+
+ if self.transport_error_msg:
+ msg = self.transport_error_msg
+ self.transport_error_msg = None
+ raise XMPPNoRecipient(msg.sender)
+
if not act:
self.idle()
"""
import os, sys, time, readline, atexit, re
-import osrf.json
-import osrf.system
-import osrf.ses
-import osrf.conf
-import osrf.log
+import osrf.json, osrf.system, osrf.ses, osrf.conf, osrf.log, osrf.net
# -------------------------------------------------------------------
# main listen loop
while True:
- resp = req.recv(timeout=120)
+ resp = None
+ try:
+ resp = req.recv(timeout=120)
+ except osrf.net.XMPPNoRecipient:
+ print "Unable to communicate with %s" % service
+ total = 0
+ break
+
osrf.log.log_internal("Looping through receive request")
if not resp:
break