11import logging
2+ import six
23
34from twisted .web import server , resource
5+ from twisted .python .compat import _PY3 , nativeString
46
57from scrapy .exceptions import NotConfigured
68from scrapy import signals
1719class 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+
2432class 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
6069class 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