Skip to content

Commit 415961e

Browse files
committed
[resources] unit failing test for returning bytes
1 parent 0f9d9bc commit 415961e

File tree

3 files changed

+22
-4
lines changed

3 files changed

+22
-4
lines changed

scrapyrt/resources.py

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -49,12 +49,10 @@ def handle_error(self, exception_or_failure, request):
4949
:return: dict which will be converted to JSON error response
5050
5151
"""
52-
failure = None
5352
if isinstance(exception_or_failure, Exception):
5453
exception = exception_or_failure
5554
elif isinstance(exception_or_failure, Failure):
5655
exception = exception_or_failure.value
57-
failure = exception_or_failure
5856
else:
5957
raise TypeError(
6058
'Expected Exception or {} instances, got {}'.format(
@@ -71,22 +69,27 @@ def handle_error(self, exception_or_failure, request):
7169
else:
7270
request.setResponseCode(500)
7371
if request.code == 500:
74-
log.err(failure)
72+
log.err(str(exception_or_failure))
7573
return self.format_error_response(exception, request)
7674

7775
def format_error_response(self, exception, request):
7876
# Python exceptions don't have message attribute in Python 3+ anymore.
7977
# Twisted HTTP Error objects still have 'message' attribute even in 3+
8078
# and they fail on str(exception) call.
8179
msg = exception.message if hasattr(exception, 'message') else str(exception)
80+
8281
return {
8382
"status": "error",
8483
"message": msg,
8584
"code": request.code
8685
}
8786

8887
def render_object(self, obj, request):
89-
r = self.json_encoder.encode(obj) + "\n"
88+
try:
89+
r = self.json_encoder.encode(obj) + "\n"
90+
except Exception as e:
91+
return self.json_encoder.encode(self.handle_error(e, request)).encode('utf8')
92+
9093
request.setHeader('Content-Type', 'application/json')
9194
request.setHeader('Access-Control-Allow-Origin', '*')
9295
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+
405+
@pytest.mark.parametrize("method", [
406+
perform_get, perform_post
407+
])
408+
def test_bytes_in_item(self, server, method):
409+
url = server.url("crawl.json")
410+
res = method(url,
411+
{"spider_name": "test"},
412+
{"url": server.target_site.url("page1.html"),
413+
'callback': 'return_bytes'})
414+
assert res.status_code == 200

0 commit comments

Comments
 (0)