Skip to content

Commit 40d4ce3

Browse files
committed
Refactored for Python3 compatibility
1 parent 15e0b70 commit 40d4ce3

File tree

3 files changed

+61
-22
lines changed

3 files changed

+61
-22
lines changed

scrapy_jsonrpc/jsonrpc.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -58,10 +58,11 @@ def jsonrpc_server_call(target, jsonrpc_request, json_decoder=None):
5858
json_decoder = ScrapyJSONDecoder()
5959

6060
try:
61-
req = json_decoder.decode(jsonrpc_request)
61+
req = json_decoder.decode(jsonrpc_request.decode('utf-8'))
6262
except Exception as e:
63-
return jsonrpc_error(None, jsonrpc_errors.PARSE_ERROR, 'Parse error',
64-
traceback.format_exc())
63+
return jsonrpc_error(
64+
None, jsonrpc_errors.PARSE_ERROR, 'Parse error',
65+
traceback.format_exc())
6566

6667
try:
6768
id, methname = req['id'], req['method']

scrapy_jsonrpc/txweb.py

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,24 @@
22

33
from twisted.web import resource
44

5-
class JsonResource(resource.Resource):
5+
6+
class JsonResource(resource.Resource, object):
67

78
json_encoder = json.JSONEncoder()
89

10+
def __init__(self):
11+
super(JsonResource, self).__init__()
12+
913
def render(self, txrequest):
10-
r = resource.Resource.render(self, txrequest)
14+
r = super(JsonResource, self).render(txrequest)
1115
return self.render_object(r, txrequest)
1216

1317
def render_object(self, obj, txrequest):
14-
r = self.json_encoder.encode(obj) + "\n"
18+
r = (self.json_encoder.encode(obj) + "\n").encode()
19+
1520
txrequest.setHeader('Content-Type', 'application/json')
1621
txrequest.setHeader('Access-Control-Allow-Origin', '*')
1722
txrequest.setHeader('Access-Control-Allow-Methods', 'GET, POST, PATCH, PUT, DELETE')
18-
txrequest.setHeader('Access-Control-Allow-Headers',' X-Requested-With')
23+
txrequest.setHeader('Access-Control-Allow-Headers', 'X-Requested-With')
1924
txrequest.setHeader('Content-Length', len(r))
2025
return r

scrapy_jsonrpc/webservice.py

Lines changed: 48 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
import logging
2+
import six
23

34
from twisted.web import server, resource
5+
from twisted.python.compat import _PY3, nativeString
46

57
from scrapy.exceptions import NotConfigured
68
from scrapy import signals
@@ -17,27 +19,34 @@
1719
class JsonResource(JsonResource_):
1820

1921
def __init__(self, crawler, target=None):
20-
JsonResource_.__init__(self)
22+
super(JsonResource, self).__init__()
23+
2124
self.crawler = crawler
2225
self.json_encoder = ScrapyJSONEncoder(crawler=crawler)
2326

27+
def getChildWithDefault(self, path, request):
28+
path = path.decode('UTF-8')
29+
return super(JsonResource, self).getChildWithDefault(path, request)
30+
31+
2432
class JsonRpcResource(JsonResource):
2533

2634
def __init__(self, crawler, target=None):
27-
JsonResource.__init__(self, crawler, target)
35+
super(JsonRpcResource, self).__init__(crawler, target)
36+
2837
self.json_decoder = ScrapyJSONDecoder(crawler=crawler)
2938
self.crawler = crawler
3039
self._target = target
3140

32-
def render_GET(self, txrequest):
41+
def render_GET(self, request):
3342
return self.get_target()
3443

35-
def render_POST(self, txrequest):
36-
reqstr = txrequest.content.getvalue()
44+
def render_POST(self, request):
45+
reqstr = request.content.getvalue()
3746
target = self.get_target()
3847
return jsonrpc_server_call(target, reqstr, self.json_decoder)
3948

40-
def getChild(self, name, txrequest):
49+
def getChild(self, name, request):
4150
target = self.get_target()
4251
try:
4352
newtarget = getattr(target, name)
@@ -54,33 +63,37 @@ class CrawlerResource(JsonRpcResource):
5463
ws_name = 'crawler'
5564

5665
def __init__(self, crawler):
57-
JsonRpcResource.__init__(self, crawler, crawler)
66+
super(CrawlerResource, self).__init__(crawler, target=crawler)
5867

5968

6069
class RootResource(JsonResource):
6170

62-
def render_GET(self, txrequest):
63-
return {'resources': self.children.keys()}
71+
def render_GET(self, request):
72+
return {'resources': list(self.children.keys())}
6473

65-
def getChild(self, name, txrequest):
74+
def getChild(self, name, request):
6675
if name == '':
6776
return self
68-
return JsonResource.getChild(self, name, txrequest)
77+
return JsonResource.getChild(self, name, request)
6978

7079

71-
class WebService(server.Site):
80+
class WebService(server.Site, object):
7281

7382
def __init__(self, crawler):
7483
if not crawler.settings.getbool('JSONRPC_ENABLED'):
7584
raise NotConfigured
76-
self.crawler = crawler
85+
7786
logfile = crawler.settings['JSONRPC_LOGFILE']
87+
self.crawler = crawler
7888
self.portrange = [int(x) for x in crawler.settings.getlist('JSONRPC_PORT', [6023, 6073])]
7989
self.host = crawler.settings.get('JSONRPC_HOST', '127.0.0.1')
90+
self.noisy = False
91+
8092
root = RootResource(crawler)
8193
root.putChild('crawler', CrawlerResource(self.crawler))
82-
server.Site.__init__(self, root, logPath=logfile)
83-
self.noisy = False
94+
95+
super(WebService, self).__init__(root, logPath=logfile)
96+
8497
crawler.signals.connect(self.start_listening, signals.engine_started)
8598
crawler.signals.connect(self.stop_listening, signals.engine_stopped)
8699

@@ -90,10 +103,30 @@ def from_crawler(cls, crawler):
90103

91104
def start_listening(self):
92105
self.port = listen_tcp(self.portrange, self.host, self)
106+
93107
logger.debug(
94108
'Web service listening on {host.host:s}:{host.port:d}'.format(
95109
host=self.port.getHost()))
96110

97111
def stop_listening(self):
98112
self.port.stopListening()
99113

114+
def log(self, request):
115+
"""
116+
Write a line representing C{request} to the access log file.
117+
118+
@param request: The request object about which to log.
119+
@type request: L{Request}
120+
"""
121+
try:
122+
logFile = self.logFile
123+
except AttributeError:
124+
pass
125+
else:
126+
line = self._logFormatter(self._logDateTime, request) + u"\n"
127+
if self._nativeize:
128+
line = nativeString(line)
129+
# If we're on Python3, we don't need to encode it
130+
elif _PY3 is False:
131+
line = line.encode("utf-8")
132+
logFile.write(line)

0 commit comments

Comments
 (0)