@@ -157,6 +157,29 @@ def _callback(request, **kwargs):
157157 self .assertEqual (channel .json_body ["error" ], "Unrecognized request" )
158158 self .assertEqual (channel .json_body ["errcode" ], "M_UNRECOGNIZED" )
159159
160+ def test_head_request (self ):
161+ """
162+ JsonResource.handler_for_request gives correctly decoded URL args to
163+ the callback, while Twisted will give the raw bytes of URL query
164+ arguments.
165+ """
166+
167+ def _callback (request , ** kwargs ):
168+ return 200 , {"result" : True }
169+
170+ res = JsonResource (self .homeserver )
171+ res .register_paths (
172+ "GET" , [re .compile ("^/_matrix/foo$" )], _callback , "test_servlet" ,
173+ )
174+
175+ # The path was registered as GET, but this is a HEAD request.
176+ request , channel = make_request (self .reactor , b"HEAD" , b"/_matrix/foo" )
177+ render (request , res , self .reactor )
178+
179+ self .assertEqual (channel .result ["code" ], b"200" )
180+ self .assertNotIn ("body" , channel .result )
181+ self .assertEqual (channel .headers .getRawHeaders (b"Content-Length" ), [b"15" ])
182+
160183
161184class OptionsResourceTests (unittest .TestCase ):
162185 def setUp (self ):
@@ -255,7 +278,7 @@ def setUp(self):
255278 self .reactor = ThreadedMemoryReactorClock ()
256279
257280 def test_good_response (self ):
258- def callback (request ):
281+ async def callback (request ):
259282 request .write (b"response" )
260283 request .finish ()
261284
@@ -275,7 +298,7 @@ def test_redirect_exception(self):
275298 with the right location.
276299 """
277300
278- def callback (request , ** kwargs ):
301+ async def callback (request , ** kwargs ):
279302 raise RedirectException (b"/look/an/eagle" , 301 )
280303
281304 res = WrapHtmlRequestHandlerTests .TestResource ()
@@ -295,7 +318,7 @@ def test_redirect_exception_with_cookie(self):
295318 returned too
296319 """
297320
298- def callback (request , ** kwargs ):
321+ async def callback (request , ** kwargs ):
299322 e = RedirectException (b"/no/over/there" , 304 )
300323 e .cookies .append (b"session=yespls" )
301324 raise e
@@ -312,3 +335,19 @@ def callback(request, **kwargs):
312335 self .assertEqual (location_headers , [b"/no/over/there" ])
313336 cookies_headers = [v for k , v in headers if k == b"Set-Cookie" ]
314337 self .assertEqual (cookies_headers , [b"session=yespls" ])
338+
339+ def test_head_request (self ):
340+ """A head request should work by being turned into a GET request."""
341+
342+ async def callback (request ):
343+ request .write (b"response" )
344+ request .finish ()
345+
346+ res = WrapHtmlRequestHandlerTests .TestResource ()
347+ res .callback = callback
348+
349+ request , channel = make_request (self .reactor , b"HEAD" , b"/path" )
350+ render (request , res , self .reactor )
351+
352+ self .assertEqual (channel .result ["code" ], b"200" )
353+ self .assertNotIn ("body" , channel .result )
0 commit comments