2
2
from subprocess import Popen , PIPE
3
3
from twisted .web .server import Site , NOT_DONE_YET
4
4
from twisted .web .resource import Resource
5
- from twisted .internet import reactor
6
- from twisted .internet .task import deferLater
5
+ from twisted .internet import reactor , defer
6
+ from scrapy import twisted_version
7
+
8
+
9
+ if twisted_version < (11 , 0 , 0 ):
10
+ def deferLater (clock , delay , func , * args , ** kw ):
11
+ def _cancel_method ():
12
+ _cancel_cb (None )
13
+ d .errback (Exception ())
14
+
15
+ def _cancel_cb (result ):
16
+ if cl .active ():
17
+ cl .cancel ()
18
+ return result
19
+
20
+ d = defer .Deferred ()
21
+ d .cancel = _cancel_method
22
+ d .addCallback (lambda ignored : func (* args , ** kw ))
23
+ d .addBoth (_cancel_cb )
24
+ cl = clock .callLater (delay , d .callback , None )
25
+ return d
26
+ else :
27
+ from twisted .internet .task import deferLater
7
28
8
29
9
30
def getarg (request , name , default = None , type = str ):
@@ -13,7 +34,9 @@ def getarg(request, name, default=None, type=str):
13
34
return default
14
35
15
36
16
- class DeferMixin (object ):
37
+ class LeafResource (Resource ):
38
+
39
+ isLeaf = True
17
40
18
41
def deferRequest (self , request , delay , f , * a , ** kw ):
19
42
def _cancelrequest (_ ):
@@ -26,9 +49,7 @@ def _cancelrequest(_):
26
49
return d
27
50
28
51
29
- class Follow (DeferMixin , Resource ):
30
-
31
- isLeaf = True
52
+ class Follow (LeafResource ):
32
53
33
54
def render (self , request ):
34
55
total = getarg (request , "total" , 100 , type = int )
@@ -57,9 +78,7 @@ def renderRequest(self, request, nlist):
57
78
request .finish ()
58
79
59
80
60
- class Delay (DeferMixin , Resource ):
61
-
62
- isLeaf = True
81
+ class Delay (LeafResource ):
63
82
64
83
def render_GET (self , request ):
65
84
n = getarg (request , "n" , 1 , type = float )
@@ -75,24 +94,21 @@ def _delayedRender(self, request, n):
75
94
request .finish ()
76
95
77
96
78
- class Status (Resource ):
79
-
80
- isLeaf = True
97
+ class Status (LeafResource ):
81
98
82
99
def render_GET (self , request ):
83
100
n = getarg (request , "n" , 200 , type = int )
84
101
request .setResponseCode (n )
85
102
return ""
86
103
87
104
88
- class Raw (DeferMixin , Resource ):
89
-
90
- isLeaf = True
105
+ class Raw (LeafResource ):
91
106
92
107
def render_GET (self , request ):
93
108
request .startedWriting = 1
94
109
self .deferRequest (request , 0 , self ._delayedRender , request )
95
110
return NOT_DONE_YET
111
+ render_POST = render_GET
96
112
97
113
def _delayedRender (self , request ):
98
114
raw = getarg (request , 'raw' , 'HTTP 1.1 200 OK\n ' )
@@ -102,15 +118,12 @@ def _delayedRender(self, request):
102
118
request .finish ()
103
119
104
120
105
- class Partial (DeferMixin , Resource ):
106
-
107
- isLeaf = True
121
+ class Partial (LeafResource ):
108
122
109
123
def render_GET (self , request ):
110
124
request .setHeader ("Content-Length" , "1024" )
111
125
self .deferRequest (request , 0 , self ._delayedRender , request )
112
126
return NOT_DONE_YET
113
- render_POST = render_GET
114
127
115
128
def _delayedRender (self , request ):
116
129
request .write ("partial content\n " )
@@ -122,10 +135,13 @@ class Drop(Partial):
122
135
def _delayedRender (self , request ):
123
136
abort = getarg (request , "abort" , 0 , type = int )
124
137
request .write ("this connection will be dropped\n " )
125
- if abort :
126
- request .channel .transport .abortConnection ()
127
- else :
128
- request .channel .transport .loseConnection ()
138
+ tr = request .channel .transport
139
+ try :
140
+ if abort and hasattr (tr , 'abortConnection' ):
141
+ tr .abortConnection ()
142
+ else :
143
+ tr .loseConnection ()
144
+ finally :
129
145
request .finish ()
130
146
131
147
@@ -165,6 +181,7 @@ def __exit__(self, exc_type, exc_value, traceback):
165
181
root = Root ()
166
182
factory = Site (root )
167
183
port = reactor .listenTCP (8998 , factory )
184
+
168
185
def print_listening ():
169
186
h = port .getHost ()
170
187
print "Mock server running at http://%s:%d" % (h .host , h .port )
0 commit comments