@@ -175,7 +175,7 @@ private static Route.Chain chain(final Iterator<Route> it) {
175175
176176 @ Override
177177 public void next (final Request req , final Response res ) throws Exception {
178- RouteImpl route = ( RouteImpl ) it .next ();
178+ RouteImpl route = get ( it .next () );
179179
180180 // set route
181181 set (req , route );
@@ -184,6 +184,15 @@ public void next(final Request req, final Response res) throws Exception {
184184 route .handle (req , res , this );
185185 }
186186
187+ private RouteImpl get (final Route next ) {
188+ Route root = next ;
189+ // Is there a better way to set route info?
190+ while (root instanceof Route .Forwarding ) {
191+ root = ((Route .Forwarding ) root ).delegate ();
192+ }
193+ return (RouteImpl )root ;
194+ }
195+
187196 private void set (final Request req , final Route route ) {
188197 Request root = req ;
189198 // Is there a better way to set route info?
@@ -212,6 +221,11 @@ private List<Route> routes(final String verb, final String requestURI, final Med
212221 final List <MediaType > accept ) {
213222 String path = verb + requestURI ;
214223 List <Route > routes = findRoutes (verb , requestURI , type , accept );
224+ if ("HEAD" .equals (verb )
225+ && !routes .stream ().filter (r -> r .verb ().equals ("HEAD" )).findFirst ().isPresent ()) {
226+ // override HEAD when it's missing.
227+ routes = findRoutes ("GET" , requestURI , type , accept , "HEAD" );
228+ }
215229
216230 // 406 or 415
217231 routes .add (RouteImpl .fromStatus ((req , res , chain ) -> {
@@ -243,17 +257,32 @@ private List<Route> routes(final String verb, final String requestURI, final Med
243257
244258 private List <Route > findRoutes (final String verb , final String path , final MediaType type ,
245259 final List <MediaType > accept ) {
260+ return findRoutes (verb , path , type , accept , verb );
261+ }
262+
263+ private List <Route > findRoutes (final String verb , final String path , final MediaType type ,
264+ final List <MediaType > accept , final String overrideVerb ) {
246265
247266 LinkedList <Route > routes = new LinkedList <Route >();
248267 for (Route .Definition routeDef : routeDefs ) {
249268 Optional <Route > route = routeDef .matches (verb , path , type , accept );
250269 if (route .isPresent ()) {
251- routes .add (route .get ());
270+ routes .add (verb .equals (overrideVerb ) ? route .get ()
271+ : overrideVerb (route .get (), overrideVerb ));
252272 }
253273 }
254274 return routes ;
255275 }
256276
277+ private static Route overrideVerb (final Route route , final String verb ) {
278+ return new Route .Forwarding (route ) {
279+ @ Override
280+ public String verb () {
281+ return verb ;
282+ }
283+ };
284+ }
285+
257286 private void defaultErrorPage (final Request request , final Response response ,
258287 final HttpStatus status , final Map <String , Object > model ) throws Exception {
259288 StringBuilder html = new StringBuilder ("<!doctype html>" )
0 commit comments