@@ -54,6 +54,25 @@ def write(self, data):
5454 return self .write (data )
5555
5656
57+ class RequestHandler (object ):
58+ def __init__ (self , environ , start_response ):
59+ self .__start_response = start_response
60+ self .__wfile = None
61+ self .headers = Headers (environ )
62+ self .rfile , self .wfile = None , Writer (self )
63+
64+ def start_response (self , headers , response_code ):
65+ """Set HTTP response code"""
66+ message , explain = BaseHTTPRequestHandler .responses [response_code ]
67+ self .__wfile = self .__start_response ('%d %s' % (response_code ,
68+ message ), headers )
69+
70+ def get_wfile (self ):
71+ if self .__wfile is None :
72+ raise ValueError ('start_response() not called' )
73+ return self .__wfile
74+
75+
5776class RequestDispatcher (object ):
5877 def __init__ (self , home , debug = False , timing = False , lang = None ):
5978 assert os .path .isdir (home ), '%r is not a directory' % (home ,)
@@ -68,13 +87,7 @@ def __init__(self, home, debug=False, timing=False, lang=None):
6887
6988 def __call__ (self , environ , start_response ):
7089 """Initialize with `apache.Request` object"""
71- self .environ = environ
72- request = RequestDispatcher (self .home , self .debug , self .timing )
73- request .__start_response = start_response
74-
75- request .wfile = Writer (request )
76- request .__wfile = None
77- request .headers = Headers (environ )
90+ request = RequestHandler (environ , start_response )
7891
7992 if environ ['REQUEST_METHOD' ] == 'OPTIONS' :
8093 if environ ["PATH_INFO" ][:5 ] == "/rest" :
@@ -89,25 +102,22 @@ def __call__(self, environ, start_response):
89102 request .wfile .write (s2b (DEFAULT_ERROR_MESSAGE % locals ()))
90103 return []
91104
92- tracker = roundup .instance .open (self .home , not self .debug )
93-
94- with self .get_tracker () as tracker :
95- # need to strip the leading '/'
96- environ ["PATH_INFO" ] = environ ["PATH_INFO" ][1 :]
97- if request .timing :
98- environ ["CGI_SHOW_TIMING" ] = request .timing
105+ # need to strip the leading '/'
106+ environ ["PATH_INFO" ] = environ ["PATH_INFO" ][1 :]
107+ if self .timing :
108+ environ ["CGI_SHOW_TIMING" ] = self .timing
99109
110+ if environ ['REQUEST_METHOD' ] in ("OPTIONS" , "DELETE" ):
111+ # these methods have no data. When we init tracker.Client
112+ # set form to None to get a properly initialized empty
113+ # form.
114+ form = None
115+ else :
100116 form = BinaryFieldStorage (fp = environ ['wsgi.input' ], environ = environ )
101117
102- if environ ['REQUEST_METHOD' ] in ("OPTIONS" , "DELETE" ):
103- # these methods have no data. When we init tracker.Client
104- # set form to None and request.rfile to None to get a
105- # properly initialized empty form.
106- form = None
107- request .rfile = None
108-
118+ with self .get_tracker () as tracker :
109119 client = tracker .Client (tracker , request , environ , form ,
110- request .translator )
120+ self .translator )
111121 try :
112122 client .main ()
113123 except roundup .cgi .client .NotFound :
@@ -118,17 +128,6 @@ def __call__(self, environ, start_response):
118128 # all body data has been written using wfile
119129 return []
120130
121- def start_response (self , headers , response_code ):
122- """Set HTTP response code"""
123- message , explain = BaseHTTPRequestHandler .responses [response_code ]
124- self .__wfile = self .__start_response ('%d %s' % (response_code ,
125- message ), headers )
126-
127- def get_wfile (self ):
128- if self .__wfile is None :
129- raise ValueError ('start_response() not called' )
130- return self .__wfile
131-
132131 @contextmanager
133132 def get_tracker (self ):
134133 # get a new instance for each request
0 commit comments