Philipp Hörist pushed to branch master at gajim / python-nbxmpp

Commits:

2 changed files:

Changes:

  • nbxmpp/errors.py
    ... ... @@ -98,6 +98,26 @@ class PubSubStanzaError(StanzaError):
    98 98
         app_namespace = Namespace.PUBSUB_ERROR
    
    99 99
     
    
    100 100
     
    
    101
    +class HTTPUploadStanzaError(StanzaError):
    
    102
    +
    
    103
    +    app_namespace = Namespace.HTTPUPLOAD_0
    
    104
    +
    
    105
    +    def get_max_file_size(self):
    
    106
    +        if self.app_condition != 'file-too-large':
    
    107
    +            return None
    
    108
    +
    
    109
    +        node = self._error_node.getTag(self.app_condition)
    
    110
    +        try:
    
    111
    +            return float(node.getTagData('max-file-size'))
    
    112
    +        except Exception:
    
    113
    +            return None
    
    114
    +
    
    115
    +    def get_retry_date(self):
    
    116
    +        if self.app_condition != 'retry':
    
    117
    +            return None
    
    118
    +        return self._error_node.getTagAttr('stamp')
    
    119
    +
    
    120
    +
    
    101 121
     class MalformedStanzaError(BaseError):
    
    102 122
     
    
    103 123
         log_level = logging.WARNING
    

  • nbxmpp/modules/http_upload.py
    ... ... @@ -17,11 +17,10 @@
    17 17
     
    
    18 18
     from nbxmpp.namespaces import Namespace
    
    19 19
     from nbxmpp.protocol import Iq
    
    20
    -from nbxmpp.protocol import isResultNode
    
    21 20
     from nbxmpp.structs import HTTPUploadData
    
    22
    -from nbxmpp.util import call_on_response
    
    23
    -from nbxmpp.util import callback
    
    24
    -from nbxmpp.util import raise_error
    
    21
    +from nbxmpp.errors import HTTPUploadStanzaError
    
    22
    +from nbxmpp.errors import MalformedStanzaError
    
    23
    +from nbxmpp.task import iq_request_task
    
    25 24
     from nbxmpp.modules.base import BaseModule
    
    26 25
     
    
    27 26
     
    
    ... ... @@ -35,52 +34,51 @@ class HTTPUpload(BaseModule):
    35 34
             self._client = client
    
    36 35
             self.handlers = []
    
    37 36
     
    
    38
    -    @call_on_response('_received_slot')
    
    37
    +    @iq_request_task
    
    39 38
         def request_slot(self, jid, filename, size, content_type):
    
    40
    -        iq = Iq(typ='get', to=jid)
    
    41
    -        attr = {'filename': filename,
    
    42
    -                'size': size,
    
    43
    -                'content-type': content_type}
    
    44
    -        iq.setTag(name="request",
    
    45
    -                  namespace=Namespace.HTTPUPLOAD_0,
    
    46
    -                  attrs=attr)
    
    47
    -        return iq
    
    48
    -
    
    49
    -    @callback
    
    50
    -    def _received_slot(self, stanza):
    
    51
    -        if not isResultNode(stanza):
    
    52
    -            return raise_error(self._log.info, stanza)
    
    53
    -
    
    54
    -        slot = stanza.getTag('slot', namespace=Namespace.HTTPUPLOAD_0)
    
    39
    +        _task = yield
    
    40
    +
    
    41
    +        response = yield _make_request(jid, filename, size, content_type)
    
    42
    +        if response.isError():
    
    43
    +            raise HTTPUploadStanzaError(response)
    
    44
    +
    
    45
    +        slot = response.getTag('slot', namespace=Namespace.HTTPUPLOAD_0)
    
    55 46
             if slot is None:
    
    56
    -            return raise_error(self._log.warning, stanza, 'stanza-malformed',
    
    57
    -                               'No slot node found')
    
    47
    +            raise MalformedStanzaError('slot node missing', response)
    
    58 48
     
    
    59 49
             put_uri = slot.getTagAttr('put', 'url')
    
    60 50
             if put_uri is None:
    
    61
    -            return raise_error(self._log.warning, stanza, 'stanza-malformed',
    
    62
    -                               'No put uri found')
    
    51
    +            raise MalformedStanzaError('put uri missing', response)
    
    63 52
     
    
    64 53
             get_uri = slot.getTagAttr('get', 'url')
    
    65 54
             if get_uri is None:
    
    66
    -            return raise_error(self._log.warning, stanza, 'stanza-malformed',
    
    67
    -                               'No get uri found')
    
    55
    +            raise MalformedStanzaError('get uri missing', response)
    
    68 56
     
    
    69 57
             headers = {}
    
    70 58
             for header in slot.getTag('put').getTags('header'):
    
    71 59
                 name = header.getAttr('name')
    
    72 60
                 if name not in ALLOWED_HEADERS:
    
    73
    -                return raise_error(self._log.warning, stanza,
    
    74
    -                                   'stanza-malformed',
    
    75
    -                                   'Not allowed header found: %s' % name)
    
    61
    +                raise MalformedStanzaError(
    
    62
    +                    'not allowed header found: %s' % name, response)
    
    63
    +
    
    76 64
                 data = header.getData()
    
    77 65
                 if '\n' in data:
    
    78
    -                return raise_error(self._log.warning, stanza,
    
    79
    -                                   'stanza-malformed',
    
    80
    -                                   'NNewline in header data found')
    
    66
    +                raise MalformedStanzaError(
    
    67
    +                    'newline in header data found', response)
    
    81 68
     
    
    82 69
                 headers[name] = data
    
    83 70
     
    
    84
    -        return HTTPUploadData(put_uri=put_uri,
    
    85
    -                              get_uri=get_uri,
    
    86
    -                              headers=headers)
    71
    +        yield HTTPUploadData(put_uri=put_uri,
    
    72
    +                             get_uri=get_uri,
    
    73
    +                             headers=headers)
    
    74
    +
    
    75
    +
    
    76
    +def _make_request(jid, filename, size, content_type):
    
    77
    +    iq = Iq(typ='get', to=jid)
    
    78
    +    attr = {'filename': filename,
    
    79
    +            'size': size,
    
    80
    +            'content-type': content_type}
    
    81
    +    iq.setTag(name="request",
    
    82
    +              namespace=Namespace.HTTPUPLOAD_0,
    
    83
    +              attrs=attr)
    
    84
    +    return iq