Prefixed request, response and data with http. Avoided (plugin_attrib) name collision with other plugins.

This commit is contained in:
Sangeeth Saravanaraj 2015-04-29 14:44:25 +05:30
parent 80b60fc048
commit 61a7cecb31
5 changed files with 59 additions and 38 deletions

View File

@ -17,7 +17,9 @@ from sleekxmpp.xmlstream.handler import Callback
from sleekxmpp.xmlstream.matcher import StanzaPath from sleekxmpp.xmlstream.matcher import StanzaPath
from sleekxmpp.plugins.base import BasePlugin from sleekxmpp.plugins.base import BasePlugin
from sleekxmpp.plugins.xep_0332.stanza import Request, Response, Data from sleekxmpp.plugins.xep_0332.stanza import (
HTTPRequest, HTTPResponse, HTTPData
)
from sleekxmpp.plugins.xep_0131.stanza import Headers from sleekxmpp.plugins.xep_0131.stanza import Headers
@ -50,18 +52,26 @@ class XEP_0332(BasePlugin):
} }
def plugin_init(self): def plugin_init(self):
self.xmpp.register_handler(Callback( self.xmpp.register_handler(
'HTTP Request', StanzaPath('iq/req'), self._handle_request Callback(
)) 'HTTP Request',
self.xmpp.register_handler(Callback( StanzaPath('iq/http-req'),
'HTTP Response', StanzaPath('iq/resp'), self._handle_response self._handle_request
)) )
register_stanza_plugin(Iq, Request, iterable=True) )
register_stanza_plugin(Iq, Response, iterable=True) self.xmpp.register_handler(
register_stanza_plugin(Request, Headers, iterable=True) Callback(
register_stanza_plugin(Request, Data, iterable=True) 'HTTP Response',
register_stanza_plugin(Response, Headers, iterable=True) StanzaPath('iq/http-resp'),
register_stanza_plugin(Response, Data, iterable=True) self._handle_response
)
)
register_stanza_plugin(Iq, HTTPRequest, iterable=True)
register_stanza_plugin(Iq, HTTPResponse, iterable=True)
register_stanza_plugin(HTTPRequest, Headers, iterable=True)
register_stanza_plugin(HTTPRequest, HTTPData, iterable=True)
register_stanza_plugin(HTTPResponse, Headers, iterable=True)
register_stanza_plugin(HTTPResponse, HTTPData, iterable=True)
# TODO: Should we register any api's here? self.api.register() # TODO: Should we register any api's here? self.api.register()
def plugin_end(self): def plugin_end(self):
@ -94,12 +104,12 @@ class XEP_0332(BasePlugin):
iq['from'] = self.xmpp.boundjid iq['from'] = self.xmpp.boundjid
iq['to'] = to iq['to'] = to
iq['type'] = 'set' iq['type'] = 'set'
iq['req']['headers'] = headers iq['http-req']['headers'] = headers
iq['req']['method'] = method iq['http-req']['method'] = method
iq['req']['resource'] = resource iq['http-req']['resource'] = resource
iq['req']['version'] = '1.1' # TODO: set this implicitly iq['http-req']['version'] = '1.1' # TODO: set this implicitly
if data is not None: if data is not None:
iq['req']['data'] = data iq['http-req']['http-data'] = data
return iq.send( return iq.send(
timeout=kwargs.get('timeout', None), timeout=kwargs.get('timeout', None),
block=kwargs.get('block', True), block=kwargs.get('block', True),
@ -113,12 +123,12 @@ class XEP_0332(BasePlugin):
iq['from'] = self.xmpp.boundjid iq['from'] = self.xmpp.boundjid
iq['to'] = to iq['to'] = to
iq['type'] = 'result' iq['type'] = 'result'
iq['resp']['headers'] = headers iq['http-resp']['headers'] = headers
iq['resp']['code'] = code iq['http-resp']['code'] = code
iq['resp']['message'] = message iq['http-resp']['message'] = message
iq['resp']['version'] = '1.1' # TODO: set this implicitly iq['http-resp']['version'] = '1.1' # TODO: set this implicitly
if data is not None: if data is not None:
iq['resp']['data'] = data iq['http-resp']['http-data'] = data
return iq.send( return iq.send(
timeout=kwargs.get('timeout', None), timeout=kwargs.get('timeout', None),
block=kwargs.get('block', True), block=kwargs.get('block', True),

View File

@ -8,6 +8,6 @@
See the file LICENSE for copying permission. See the file LICENSE for copying permission.
""" """
from sleekxmpp.plugins.xep_0332.stanza.request import Request from sleekxmpp.plugins.xep_0332.stanza.request import HTTPRequest
from sleekxmpp.plugins.xep_0332.stanza.response import Response from sleekxmpp.plugins.xep_0332.stanza.response import HTTPResponse
from sleekxmpp.plugins.xep_0332.stanza.data import Data from sleekxmpp.plugins.xep_0332.stanza.data import HTTPData

View File

@ -11,14 +11,14 @@
from sleekxmpp.xmlstream import ElementBase from sleekxmpp.xmlstream import ElementBase
class Data(ElementBase): class HTTPData(ElementBase):
""" """
The data element. The data element.
""" """
name = 'data' name = 'data'
namespace = 'urn:xmpp:http' namespace = 'urn:xmpp:http'
interfaces = set(['data']) interfaces = set(['data'])
plugin_attrib = 'data' plugin_attrib = 'http-data'
is_extension = True is_extension = True
def get_data(self, encoding='text'): def get_data(self, encoding='text'):

View File

@ -11,16 +11,19 @@
from sleekxmpp.xmlstream import ElementBase from sleekxmpp.xmlstream import ElementBase
class Request(ElementBase): class HTTPRequest(ElementBase):
""" """
All HTTP communication is done using the `Request`/`Response` paradigm. All HTTP communication is done using the `Request`/`Response` paradigm.
Each HTTP Request is made sending an `iq` stanza containing a `req` element Each HTTP Request is made sending an `iq` stanza containing a `req`
to the server. Each `iq` stanza sent is of type `set`. element to the server. Each `iq` stanza sent is of type `set`.
Examples: Examples:
<iq type='set' from='a@b.com/browser' to='x@y.com' id='1'> <iq type='set' from='a@b.com/browser' to='x@y.com' id='1'>
<req xmlns='urn:xmpp:http' method='GET' resource='/api/users' version='1.1'> <req xmlns='urn:xmpp:http'
method='GET'
resource='/api/users'
version='1.1'>
<headers xmlns='http://jabber.org/protocol/shim'> <headers xmlns='http://jabber.org/protocol/shim'>
<header name='Host'>b.com</header> <header name='Host'>b.com</header>
</headers> </headers>
@ -28,7 +31,10 @@ class Request(ElementBase):
</iq> </iq>
<iq type='set' from='a@b.com/browser' to='x@y.com' id='2'> <iq type='set' from='a@b.com/browser' to='x@y.com' id='2'>
<req xmlns='urn:xmpp:http' method='PUT' resource='/api/users' version='1.1'> <req xmlns='urn:xmpp:http'
method='PUT'
resource='/api/users'
version='1.1'>
<headers xmlns='http://jabber.org/protocol/shim'> <headers xmlns='http://jabber.org/protocol/shim'>
<header name='Host'>b.com</header> <header name='Host'>b.com</header>
<header name='Content-Type'>text/html</header> <header name='Content-Type'>text/html</header>
@ -44,7 +50,7 @@ class Request(ElementBase):
name = 'request' name = 'request'
namespace = 'urn:xmpp:http' namespace = 'urn:xmpp:http'
interfaces = set(['method', 'resource', 'version']) interfaces = set(['method', 'resource', 'version'])
plugin_attrib = 'req' plugin_attrib = 'http-req'
def get_method(self): def get_method(self):
return self._get_attr('method', None) return self._get_attr('method', None)

View File

@ -11,7 +11,7 @@
from sleekxmpp.xmlstream import ElementBase from sleekxmpp.xmlstream import ElementBase
class Response(ElementBase): class HTTPResponse(ElementBase):
""" """
When the HTTP Server responds, it does so by sending an `iq` stanza When the HTTP Server responds, it does so by sending an `iq` stanza
@ -21,8 +21,13 @@ class Response(ElementBase):
in which the original requests were made. in which the original requests were made.
Examples: Examples:
<iq type='result' from='httpserver@clayster.com' to='httpclient@clayster.com/browser' id='2'> <iq type='result'
<resp xmlns='urn:xmpp:http' version='1.1' statusCode='200' statusMessage='OK'> from='httpserver@clayster.com'
to='httpclient@clayster.com/browser' id='2'>
<resp xmlns='urn:xmpp:http'
version='1.1'
statusCode='200'
statusMessage='OK'>
<headers xmlns='http://jabber.org/protocol/shim'> <headers xmlns='http://jabber.org/protocol/shim'>
<header name='Date'>Fri, 03 May 2013 16:39:54GMT-4</header> <header name='Date'>Fri, 03 May 2013 16:39:54GMT-4</header>
<header name='Server'>Clayster</header> <header name='Server'>Clayster</header>
@ -42,7 +47,7 @@ class Response(ElementBase):
name = 'response' name = 'response'
namespace = 'urn:xmpp:http' namespace = 'urn:xmpp:http'
interfaces = set(['code', 'message', 'version']) interfaces = set(['code', 'message', 'version'])
plugin_attrib = 'resp' plugin_attrib = 'http-resp'
def get_code(self): def get_code(self):
code = self._get_attr('statusCode', None) code = self._get_attr('statusCode', None)