@@ -15,11 +15,26 @@ public function __construct(RequestContext $context)
1515 $ this ->context = $ context ;
1616 }
1717
18- public function match ($ rawPathinfo )
18+ public function match ($ pathinfo )
19+ {
20+ $ allow = array ();
21+ if ($ ret = $ this ->doMatch ($ pathinfo , $ allow )) {
22+ return $ ret ;
23+ }
24+ if ('/ ' !== $ pathinfo && in_array ($ this ->context ->getMethod (), array ('HEAD ' , 'GET ' ), true )) {
25+ $ pathinfo = '/ ' !== $ pathinfo [-1 ] ? $ pathinfo .'/ ' : substr ($ pathinfo , 0 , -1 );
26+ if ($ ret = $ this ->doMatch ($ pathinfo )) {
27+ return $ this ->redirect ($ pathinfo , $ ret ['_route ' ]) + $ ret ;
28+ }
29+ }
30+
31+ throw $ allow ? new MethodNotAllowedException (array_keys ($ allow )) : new ResourceNotFoundException ();
32+ }
33+
34+ private function doMatch (string $ rawPathinfo , array &$ allow = array ()): ?array
1935 {
2036 $ allow = array ();
2137 $ pathinfo = rawurldecode ($ rawPathinfo );
22- $ trimmedPathinfo = rtrim ($ pathinfo , '/ ' );
2338 $ context = $ this ->context ;
2439 $ requestMethod = $ canonicalMethod = $ context ->getMethod ();
2540
@@ -30,32 +45,34 @@ public function match($rawPathinfo)
3045 $ matchedPathinfo = $ pathinfo ;
3146 $ regexList = array (
3247 0 => '{^(? '
33- .'|/(en|fr)(? '
34- .'|/admin/post(? '
35- .'|/?(*:34) '
36- .'|/new(*:45) '
37- .'|/( \\d+)(? '
38- .'|(*:61) '
39- .'|/edit(*:73) '
40- .'|/delete(*:87) '
48+ .'|/(en|fr)/(? '
49+ .'|admin/post/(? '
50+ .'|(*:33) '
51+ .'|new(*:43) '
52+ .'|( \\d+)(? '
53+ .'|(*:58) '
54+ .'|/(? '
55+ .'|edit(*:73) '
56+ .'|delete(*:86) '
57+ .') '
4158 .') '
4259 .') '
43- .'|/ blog(? '
44- .'|/? (*:106 ) '
45- .'|/ rss \\.xml(*:123 ) '
46- .'|/ p(? '
47- .'|age/([^/]++)(*:148 ) '
48- .'|osts/([^/]++)(*:169 ) '
60+ .'|blog/ (? '
61+ .'|(*:104 ) '
62+ .'|rss \\.xml(*:120 ) '
63+ .'|p(? '
64+ .'|age/([^/]++)(*:144 ) '
65+ .'|osts/([^/]++)(*:165 ) '
4966 .') '
50- .'|/ comments/( \\d+)/new(*:197 ) '
51- .'|/ search(*:212 ) '
67+ .'|comments/( \\d+)/new(*:192 ) '
68+ .'|search(*:206 ) '
5269 .') '
53- .'|/ log(? '
54- .'|in(*:230 ) '
55- .'|out(*:241 ) '
70+ .'|log(? '
71+ .'|in(*:223 ) '
72+ .'|out(*:234 ) '
5673 .') '
5774 .') '
58- .'|/(en|fr)?(*:260 ) '
75+ .'|/(en|fr)?(*:253 ) '
5976 .')$}sD ' ,
6077 );
6178
@@ -64,20 +81,20 @@ public function match($rawPathinfo)
6481 switch ($ m = (int ) $ matches ['MARK ' ]) {
6582 default :
6683 $ routes = array (
67- 34 => array (array ('_route ' => 'a ' , '_locale ' => 'en ' ), array ('_locale ' ), null , null , true ),
68- 45 => array (array ('_route ' => 'b ' , '_locale ' => 'en ' ), array ('_locale ' ), null , null ),
69- 61 => array (array ('_route ' => 'c ' , '_locale ' => 'en ' ), array ('_locale ' , 'id ' ), null , null ),
84+ 33 => array (array ('_route ' => 'a ' , '_locale ' => 'en ' ), array ('_locale ' ), null , null ),
85+ 43 => array (array ('_route ' => 'b ' , '_locale ' => 'en ' ), array ('_locale ' ), null , null ),
86+ 58 => array (array ('_route ' => 'c ' , '_locale ' => 'en ' ), array ('_locale ' , 'id ' ), null , null ),
7087 73 => array (array ('_route ' => 'd ' , '_locale ' => 'en ' ), array ('_locale ' , 'id ' ), null , null ),
71- 87 => array (array ('_route ' => 'e ' , '_locale ' => 'en ' ), array ('_locale ' , 'id ' ), null , null ),
72- 106 => array (array ('_route ' => 'f ' , '_locale ' => 'en ' ), array ('_locale ' ), null , null , true ),
73- 123 => array (array ('_route ' => 'g ' , '_locale ' => 'en ' ), array ('_locale ' ), null , null ),
74- 148 => array (array ('_route ' => 'h ' , '_locale ' => 'en ' ), array ('_locale ' , 'page ' ), null , null ),
75- 169 => array (array ('_route ' => 'i ' , '_locale ' => 'en ' ), array ('_locale ' , 'page ' ), null , null ),
76- 197 => array (array ('_route ' => 'j ' , '_locale ' => 'en ' ), array ('_locale ' , 'id ' ), null , null ),
77- 212 => array (array ('_route ' => 'k ' , '_locale ' => 'en ' ), array ('_locale ' ), null , null ),
78- 230 => array (array ('_route ' => 'l ' , '_locale ' => 'en ' ), array ('_locale ' ), null , null ),
79- 241 => array (array ('_route ' => 'm ' , '_locale ' => 'en ' ), array ('_locale ' ), null , null ),
80- 260 => array (array ('_route ' => 'n ' , '_locale ' => 'en ' ), array ('_locale ' ), null , null ),
88+ 86 => array (array ('_route ' => 'e ' , '_locale ' => 'en ' ), array ('_locale ' , 'id ' ), null , null ),
89+ 104 => array (array ('_route ' => 'f ' , '_locale ' => 'en ' ), array ('_locale ' ), null , null ),
90+ 120 => array (array ('_route ' => 'g ' , '_locale ' => 'en ' ), array ('_locale ' ), null , null ),
91+ 144 => array (array ('_route ' => 'h ' , '_locale ' => 'en ' ), array ('_locale ' , 'page ' ), null , null ),
92+ 165 => array (array ('_route ' => 'i ' , '_locale ' => 'en ' ), array ('_locale ' , 'page ' ), null , null ),
93+ 192 => array (array ('_route ' => 'j ' , '_locale ' => 'en ' ), array ('_locale ' , 'id ' ), null , null ),
94+ 206 => array (array ('_route ' => 'k ' , '_locale ' => 'en ' ), array ('_locale ' ), null , null ),
95+ 223 => array (array ('_route ' => 'l ' , '_locale ' => 'en ' ), array ('_locale ' ), null , null ),
96+ 234 => array (array ('_route ' => 'm ' , '_locale ' => 'en ' ), array ('_locale ' ), null , null ),
97+ 253 => array (array ('_route ' => 'n ' , '_locale ' => 'en ' ), array ('_locale ' ), null , null ),
8198 );
8299
83100 list ($ ret , $ vars , $ requiredMethods , $ requiredSchemes ) = $ routes [$ m ];
@@ -88,22 +105,13 @@ public function match($rawPathinfo)
88105 }
89106 }
90107
91- if (empty ($ routes [$ m ][4 ]) || '/ ' === $ pathinfo [-1 ]) {
92- // no-op
93- } elseif ('GET ' !== $ canonicalMethod ) {
94- $ allow ['GET ' ] = 'GET ' ;
95- break ;
96- } else {
97- return array_replace ($ ret , $ this ->redirect ($ rawPathinfo .'/ ' , $ ret ['_route ' ]));
98- }
99-
100108 if ($ requiredSchemes && !isset ($ requiredSchemes [$ context ->getScheme ()])) {
101109 if ('GET ' !== $ canonicalMethod ) {
102110 $ allow ['GET ' ] = 'GET ' ;
103111 break ;
104112 }
105113
106- return array_replace ( $ ret , $ this ->redirect ($ rawPathinfo , $ ret ['_route ' ], key ($ requiredSchemes ))) ;
114+ return $ this ->redirect ($ rawPathinfo , $ ret ['_route ' ], key ($ requiredSchemes )) + $ ret ;
107115 }
108116
109117 if ($ requiredMethods && !isset ($ requiredMethods [$ canonicalMethod ]) && !isset ($ requiredMethods [$ requestMethod ])) {
@@ -114,14 +122,14 @@ public function match($rawPathinfo)
114122 return $ ret ;
115123 }
116124
117- if (260 === $ m ) {
125+ if (253 === $ m ) {
118126 break ;
119127 }
120128 $ regex = substr_replace ($ regex , 'F ' , $ m - $ offset , 1 + strlen ($ m ));
121129 $ offset += strlen ($ m );
122130 }
123131 }
124132
125- throw $ allow ? new MethodNotAllowedException ( array_keys ( $ allow )) : new ResourceNotFoundException () ;
133+ return null ;
126134 }
127135}
0 commit comments