Skip to content

Commit b65bf50

Browse files
authored
Merge pull request #119 from scrapinghub/fix-95
Fix 95
2 parents 2ff31fb + 18404df commit b65bf50

File tree

3 files changed

+26
-1
lines changed

3 files changed

+26
-1
lines changed

scrapyrt/resources.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,18 @@
1212
from .utils import extract_scrapy_request_args, to_bytes
1313

1414

15+
class AdaptedScrapyJSONEncoder(ScrapyJSONEncoder):
16+
def default(self, o):
17+
if isinstance(o, bytes):
18+
return o.decode('utf8')
19+
else:
20+
return super().default(o)
21+
22+
1523
# XXX super() calls won't work wihout object mixin in Python 2
1624
# maybe this can be removed at some point?
1725
class ServiceResource(resource.Resource, object):
18-
json_encoder = ScrapyJSONEncoder()
26+
json_encoder = AdaptedScrapyJSONEncoder()
1927

2028
def __init__(self, root=None):
2129
resource.Resource.__init__(self)
@@ -79,6 +87,7 @@ def format_error_response(self, exception, request):
7987
# Twisted HTTP Error objects still have 'message' attribute even in 3+
8088
# and they fail on str(exception) call.
8189
msg = exception.message if hasattr(exception, 'message') else str(exception)
90+
8291
return {
8392
"status": "error",
8493
"message": msg,
@@ -87,6 +96,7 @@ def format_error_response(self, exception, request):
8796

8897
def render_object(self, obj, request):
8998
r = self.json_encoder.encode(obj) + "\n"
99+
90100
request.setHeader('Content-Type', 'application/json')
91101
request.setHeader('Access-Control-Allow-Origin', '*')
92102
request.setHeader('Access-Control-Allow-Methods',

tests/sample_data/testproject/testproject/spiders/testspider.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@ def parse(self, response):
1212
name = response.xpath('//h1/text()').extract()
1313
return TestprojectItem(name=name)
1414

15+
def return_bytes(self, response):
16+
return TestprojectItem(name=b'Some bytes here')
17+
1518
def some_errback(self, err):
1619
self.logger.error("Logging some error {}".format(err))
1720
return

tests/test_resource_crawl.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -400,3 +400,15 @@ def test_passing_errback(self, server, method):
400400

401401
msg = 'ERROR: Logging some error'
402402
assert re.search(msg, log_file)
403+
404+
@pytest.mark.parametrize("method", [
405+
perform_get, perform_post
406+
])
407+
def test_bytes_in_item(self, server, method):
408+
url = server.url("crawl.json")
409+
res = method(url,
410+
{"spider_name": "test"},
411+
{"url": server.target_site.url("page1.html"),
412+
'callback': 'return_bytes'})
413+
assert res.status_code == 200
414+
assert res.json()["items"] == [{'name': 'Some bytes here'}]

0 commit comments

Comments
 (0)