1
1
import logging
2
+ import six
2
3
3
4
from twisted .web import server , resource
5
+ from twisted .python .compat import _PY3 , nativeString
4
6
5
7
from scrapy .exceptions import NotConfigured
6
8
from scrapy import signals
17
19
class JsonResource (JsonResource_ ):
18
20
19
21
def __init__ (self , crawler , target = None ):
20
- JsonResource_ .__init__ (self )
22
+ super (JsonResource , self ).__init__ ()
23
+
21
24
self .crawler = crawler
22
25
self .json_encoder = ScrapyJSONEncoder (crawler = crawler )
23
26
27
+ def getChildWithDefault (self , path , request ):
28
+ path = path .decode ('UTF-8' )
29
+ return super (JsonResource , self ).getChildWithDefault (path , request )
30
+
31
+
24
32
class JsonRpcResource (JsonResource ):
25
33
26
34
def __init__ (self , crawler , target = None ):
27
- JsonResource .__init__ (self , crawler , target )
35
+ super (JsonRpcResource , self ).__init__ (crawler , target )
36
+
28
37
self .json_decoder = ScrapyJSONDecoder (crawler = crawler )
29
38
self .crawler = crawler
30
39
self ._target = target
31
40
32
- def render_GET (self , txrequest ):
41
+ def render_GET (self , request ):
33
42
return self .get_target ()
34
43
35
- def render_POST (self , txrequest ):
36
- reqstr = txrequest .content .getvalue ()
44
+ def render_POST (self , request ):
45
+ reqstr = request .content .getvalue ()
37
46
target = self .get_target ()
38
47
return jsonrpc_server_call (target , reqstr , self .json_decoder )
39
48
40
- def getChild (self , name , txrequest ):
49
+ def getChild (self , name , request ):
41
50
target = self .get_target ()
42
51
try :
43
52
newtarget = getattr (target , name )
@@ -54,33 +63,37 @@ class CrawlerResource(JsonRpcResource):
54
63
ws_name = 'crawler'
55
64
56
65
def __init__ (self , crawler ):
57
- JsonRpcResource . __init__ ( self , crawler , crawler )
66
+ super ( CrawlerResource , self ). __init__ ( crawler , target = crawler )
58
67
59
68
60
69
class RootResource (JsonResource ):
61
70
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 () )}
64
73
65
- def getChild (self , name , txrequest ):
74
+ def getChild (self , name , request ):
66
75
if name == '' :
67
76
return self
68
- return JsonResource .getChild (self , name , txrequest )
77
+ return JsonResource .getChild (self , name , request )
69
78
70
79
71
- class WebService (server .Site ):
80
+ class WebService (server .Site , object ):
72
81
73
82
def __init__ (self , crawler ):
74
83
if not crawler .settings .getbool ('JSONRPC_ENABLED' ):
75
84
raise NotConfigured
76
- self . crawler = crawler
85
+
77
86
logfile = crawler .settings ['JSONRPC_LOGFILE' ]
87
+ self .crawler = crawler
78
88
self .portrange = [int (x ) for x in crawler .settings .getlist ('JSONRPC_PORT' , [6023 , 6073 ])]
79
89
self .host = crawler .settings .get ('JSONRPC_HOST' , '127.0.0.1' )
90
+ self .noisy = False
91
+
80
92
root = RootResource (crawler )
81
93
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
+
84
97
crawler .signals .connect (self .start_listening , signals .engine_started )
85
98
crawler .signals .connect (self .stop_listening , signals .engine_stopped )
86
99
@@ -90,10 +103,30 @@ def from_crawler(cls, crawler):
90
103
91
104
def start_listening (self ):
92
105
self .port = listen_tcp (self .portrange , self .host , self )
106
+
93
107
logger .debug (
94
108
'Web service listening on {host.host:s}:{host.port:d}' .format (
95
109
host = self .port .getHost ()))
96
110
97
111
def stop_listening (self ):
98
112
self .port .stopListening ()
99
113
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