Skip to content

Commit 6003493

Browse files
committed
integrate to twisted's File object with spyne.model.File while using TwistedWebResource transport.
1 parent ac657fe commit 6003493

File tree

1 file changed

+18
-2
lines changed

1 file changed

+18
-2
lines changed

spyne/server/twisted/http.py

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,12 +49,13 @@
4949

5050
from os import fstat
5151
from mmap import mmap
52-
from inspect import isgenerator
52+
from inspect import isgenerator, isclass
5353
from collections import namedtuple
5454

55-
from twisted.python.log import err
55+
from twisted.web import static
5656
from twisted.web.server import NOT_DONE_YET, Request
5757
from twisted.web.resource import Resource, NoResource
58+
from twisted.python.log import err
5859
from twisted.internet.defer import Deferred
5960

6061
from spyne.error import InternalError
@@ -108,6 +109,7 @@ def set_mime_type(self, what):
108109
def get_cookie(self, key):
109110
return self.req.getCookie(key)
110111

112+
111113
class TwistedHttpMethodContext(HttpMethodContext):
112114
default_transport_context = TwistedHttpTransportContext
113115

@@ -450,14 +452,28 @@ def _cb_deferred(ret, request, p_ctx, others, resource, cb=True):
450452
_set_response_headers(request, p_ctx.transport.resp_headers)
451453

452454
om = p_ctx.descriptor.out_message
455+
single_class = None
453456
if cb and ((not issubclass(om, ComplexModelBase)) or len(om._type_info) <= 1):
454457
p_ctx.out_object = [ret]
458+
if len(om._type_info) == 1:
459+
single_class, = om._type_info.values()
460+
455461
else:
456462
p_ctx.out_object = ret
457463

458464
retval = None
465+
459466
if isinstance(ret, PushBase):
460467
retval = _init_push(ret, request, p_ctx, others, resource)
468+
469+
elif ((isclass(om) and issubclass(om, File)) or
470+
(isclass(single_class) and issubclass(single_class, File))) and \
471+
getattr(ret, 'abspath', None) is not None:
472+
473+
file = static.File(ret.abspath,
474+
defaultType=str(ret.type) or 'application/octet-stream')
475+
retval = file.render_GET(request)
476+
461477
else:
462478
resource.http_transport.get_out_string(p_ctx)
463479

0 commit comments

Comments
 (0)