11from twisted .internet import defer , protocol , reactor
22from twisted .protocols import basic
3- from twisted .web2 import server , http , resource , responsecode , stream , channel
4- from twisted .application import service , strports
3+ from twisted .web2 import http , resource , responsecode , stream
54
65import struct
76
87
98class uWSGIClientResource (resource .LeafResource ):
109
11- def __init__ (self ,app = '' , port = 3030 , host = 'localhost' ):
10+ def __init__ (self , app = '' , port = 3030 , host = 'localhost' ):
1211 resource .LeafResource .__init__ (self )
1312 self .host = host
1413 self .port = port
15- self .app = app
16-
14+ self .app = app
15+
1716 def renderHTTP (self , request ):
1817 return uWSGI (request , self .app , self .host , self .port )
1918
19+
2020def uWSGI (request , app , host , port ):
2121 if request .stream .length is None :
2222 return http .Response (responsecode .LENGTH_REQUIRED )
@@ -25,60 +25,59 @@ def uWSGI(request, app, host, port):
2525 factory = uWSGIClientProtocolFactory (request )
2626 reactor .connectTCP (host , port , factory )
2727 return factory .deferred
28-
28+
29+
2930class uWSGIClientProtocol (basic .LineReceiver ):
30-
31+
3132 def __init__ (self , request , deferred ):
3233 self .request = request
3334 self .deferred = deferred
3435 self .stream = stream .ProducerStream ()
3536 self .response = http .Response (stream = self .stream )
36- self .status_parsed = None
37+ self .status_parsed = None
3738
38- def build_uwsgi_var (self ,key ,value ):
39- return struct .pack ('<H' ,len (key )) + key + struct .pack ('<H' ,len (value )) + value
39+ def build_uwsgi_var (self , key , value ):
40+ return struct .pack ('<H' , len (key )) + key + struct .pack ('<H' , len (value )) + value
4041
4142 def connectionMade (self ):
42- print self .request .__dict__
43- # reset response parser
44- self .status_parsed = None
45- # build header and vars
46- vars = ''
47-
48- if self .request .stream .length :
49- vars += self .build_uwsgi_var ('CONTENT_LENGTH' ,str (self .request .stream .length ))
50-
51- for hkey , hval in self .request .headers .getAllRawHeaders ():
52- # use a list, probably it will be extended
53- if hkey .lower () not in ('content-type' ):
54- vars += self .build_uwsgi_var ('HTTP_' + hkey .upper ().replace ('-' ,'_' ),',' .join (hval ))
55- else :
56- vars += self .build_uwsgi_var (hkey .upper ().replace ('-' ,'_' ),',' .join (hval ))
57-
58-
59- vars += self .build_uwsgi_var ('REQUEST_METHOD' , self .request .method )
60- vars += self .build_uwsgi_var ('SCRIPT_NAME' , self .request .uwsgi_app )
61- vars += self .build_uwsgi_var ('PATH_INFO' , self .request .path [len (self .request .uwsgi_app ):])
62- vars += self .build_uwsgi_var ('QUERY_STRING' , self .request .querystring )
63- vars += self .build_uwsgi_var ('SERVER_NAME' , self .request .host )
64- vars += self .build_uwsgi_var ('SERVER_PORT' , str (self .request .port ))
65- vars += self .build_uwsgi_var ('SERVER_PROTOCOL' , self .request .scheme .upper ()+ '/' + str (self .request .clientproto [0 ]) + '.' + str (self .request .clientproto [1 ]))
66-
67- vars += self .build_uwsgi_var ('REQUEST_URI' , self .request .uri )
68- vars += self .build_uwsgi_var ('REMOTE_ADDR' , self .request .remoteAddr .host )
69-
70-
71- self .transport .write (struct .pack ('<BHB' ,0 , len (vars ),0 ))
72- self .transport .write (vars )
73-
74- # send request data
43+ print (self .request .__dict__ )
44+ # reset response parser
45+ self .status_parsed = None
46+ # build header and vars
47+ vars = ''
48+
49+ if self .request .stream .length :
50+ vars += self .build_uwsgi_var ('CONTENT_LENGTH' , str (self .request .stream .length ))
51+
52+ for hkey , hval in self .request .headers .getAllRawHeaders ():
53+ # use a list, probably it will be extended
54+ if hkey .lower () not in ('content-type' ):
55+ vars += self .build_uwsgi_var ('HTTP_' + hkey .upper ().replace ('-' , '_' ), ',' .join (hval ))
56+ else :
57+ vars += self .build_uwsgi_var (hkey .upper ().replace ('-' , '_' ), ',' .join (hval ))
58+
59+ vars += self .build_uwsgi_var ('REQUEST_METHOD' , self .request .method )
60+ vars += self .build_uwsgi_var ('SCRIPT_NAME' , self .request .uwsgi_app )
61+ vars += self .build_uwsgi_var ('PATH_INFO' , self .request .path [len (self .request .uwsgi_app ):])
62+ vars += self .build_uwsgi_var ('QUERY_STRING' , self .request .querystring )
63+ vars += self .build_uwsgi_var ('SERVER_NAME' , self .request .host )
64+ vars += self .build_uwsgi_var ('SERVER_PORT' , str (self .request .port ))
65+ vars += self .build_uwsgi_var ('SERVER_PROTOCOL' , self .request .scheme .upper () + '/' + str (self .request .clientproto [0 ]) + '.' + str (self .request .clientproto [1 ]))
66+
67+ vars += self .build_uwsgi_var ('REQUEST_URI' , self .request .uri )
68+ vars += self .build_uwsgi_var ('REMOTE_ADDR' , self .request .remoteAddr .host )
69+
70+ self .transport .write (struct .pack ('<BHB' , 0 , len (vars ), 0 ))
71+ self .transport .write (vars )
72+
73+ # send request data
7574 stream .StreamProducer (self .request .stream ).beginProducing (self .transport )
76-
75+
7776 def lineReceived (self , line ):
78- if self .status_parsed is None :
79- self .response .code = line .split (' ' ,2 )[1 ]
80- self .status_parsed = True
81- return
77+ if self .status_parsed is None :
78+ self .response .code = line .split (' ' , 2 )[1 ]
79+ self .status_parsed = True
80+ return
8281
8382 # end of headers
8483 if line == '' :
@@ -87,33 +86,33 @@ def lineReceived(self, line):
8786 self .response = None
8887 return
8988
90- name , value = line .split (':' ,1 )
89+ name , value = line .split (':' , 1 )
9190 value = value .strip ()
9291
9392 self .response .headers .addRawHeader (name , value )
94-
93+
9594 def rawDataReceived (self , data ):
9695 self .stream .write (data )
97-
96+
9897 def connectionLost (self , reason ):
9998 self .stream .finish ()
100-
101-
99+
100+
102101class uWSGIClientProtocolFactory (protocol .ClientFactory ):
103102
104103 protocol = uWSGIClientProtocol
105- noisy = False # Make Factory shut up
106-
104+ noisy = False # Make Factory shut up
105+
107106 def __init__ (self , request ):
108107 self .request = request
109108 self .deferred = defer .Deferred ()
110-
109+
111110 def buildProtocol (self , addr ):
112111 return self .protocol (self .request , self .deferred )
113-
112+
114113 def clientConnectionFailed (self , connector , reason ):
115114 self .sendFailureResponse (reason )
116-
115+
117116 def sendFailureResponse (self , reason ):
118117 response = http .Response (code = responsecode .BAD_GATEWAY , stream = str (reason .value ))
119118 self .deferred .callback (response )
0 commit comments