Skip to content

Commit 65dd138

Browse files
committed
When an UrlMappingInfo for a status code is matched, add parameters from UrlMappingInfo of previous request
1 parent 21599ba commit 65dd138

File tree

5 files changed

+61
-5
lines changed

5 files changed

+61
-5
lines changed

grails-web-mvc/src/main/groovy/org/grails/web/errors/GrailsExceptionResolver.java

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,16 +20,15 @@
2020
import grails.util.Environment;
2121

2222
import java.io.IOException;
23-
import java.util.Collections;
24-
import java.util.Enumeration;
25-
import java.util.List;
26-
import java.util.Map;
23+
import java.util.*;
2724

2825
import javax.servlet.ServletContext;
2926
import javax.servlet.ServletException;
3027
import javax.servlet.http.HttpServletRequest;
3128
import javax.servlet.http.HttpServletResponse;
3229

30+
import grails.web.mapping.UrlMapping;
31+
import grails.web.servlet.mvc.GrailsParameterMap;
3332
import org.apache.commons.logging.Log;
3433
import org.apache.commons.logging.LogFactory;
3534
import org.codehaus.groovy.control.CompilationFailedException;
@@ -41,8 +40,10 @@
4140
import grails.core.support.GrailsApplicationAware;
4241
import grails.web.mapping.UrlMappingInfo;
4342
import org.grails.exceptions.ExceptionUtils;
43+
import org.grails.web.mapping.DefaultUrlMappingInfo;
4444
import org.grails.web.mapping.UrlMappingUtils;
4545
import grails.web.mapping.UrlMappingsHolder;
46+
import org.grails.web.servlet.mvc.GrailsWebRequest;
4647
import org.grails.web.util.GrailsApplicationAttributes;
4748
import org.grails.web.servlet.mvc.exceptions.GrailsMVCException;
4849
import org.grails.web.sitemesh.GrailsContentBufferingResponse;
@@ -162,6 +163,18 @@ protected ModelAndView resolveViewOrForward(Exception ex, UrlMappingsHolder urlM
162163
HttpServletResponse response, ModelAndView mv) {
163164

164165
UrlMappingInfo info = matchStatusCode(ex, urlMappings);
166+
167+
if ( info != null ) {
168+
UrlMappingInfo requestInfo = urlMappings.match(request.getRequestURI());
169+
170+
if ( requestInfo != null ) {
171+
Map params = new HashMap();
172+
params.putAll(requestInfo.getParameters());
173+
params.putAll(UrlMappingUtils.collectParamsNotInUrlMappingKeywords(info.getParameters()));
174+
info = new DefaultUrlMappingInfo(info, params, grailsApplication);
175+
}
176+
}
177+
165178
try {
166179
if (info != null && info.getViewName() != null) {
167180
resolveView(request, info, mv);

grails-web-url-mappings/src/main/groovy/grails/web/mapping/UrlMappingInfo.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,4 +121,6 @@ public interface UrlMappingInfo {
121121
* @return redirect information for this url mapping, null if no redirect is specified
122122
*/
123123
Object getRedirectInfo();
124+
125+
UrlMappingData getUrlData();
124126
}

grails-web-url-mappings/src/main/groovy/org/grails/web/mapping/DefaultUrlMappingInfo.java

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import grails.web.mapping.UrlMapping;
3131
import grails.web.mapping.UrlMappingData;
3232
import grails.core.GrailsApplication;
33+
import grails.web.mapping.UrlMappingInfo;
3334
import grails.web.mapping.exceptions.UrlMappingException;
3435
import org.grails.web.servlet.mvc.GrailsWebRequest;
3536
import org.grails.web.util.WebUtils;
@@ -124,7 +125,6 @@ public DefaultUrlMappingInfo(Object viewName, Map params, UrlMappingData urlData
124125
this(params, urlData, grailsApplication);
125126
this.viewName = viewName;
126127
Assert.notNull(viewName, "Argument [viewName] cannot be null or blank");
127-
128128
}
129129

130130
public DefaultUrlMappingInfo(Object uri, UrlMappingData data, GrailsApplication grailsApplication) {
@@ -140,6 +140,17 @@ public DefaultUrlMappingInfo(Object uri,String httpMethod, UrlMappingData data,
140140
Assert.notNull(uri, "Argument [uri] cannot be null or blank");
141141
}
142142

143+
public DefaultUrlMappingInfo(UrlMappingInfo info, Map params, GrailsApplication grailsApplication) {
144+
this(params, info.getUrlData(), grailsApplication);
145+
this.redirectInfo = info.getRedirectInfo();
146+
this.controllerName = info.getControllerName();
147+
this.actionName = info.getActionName();
148+
this.namespace = info.getNamespace();
149+
this.pluginName = info.getPluginName();
150+
this.viewName = info.getViewName();
151+
}
152+
153+
143154
@Override
144155
public String getHttpMethod() {
145156
return httpMethod;
@@ -268,6 +279,11 @@ public Object getRedirectInfo() {
268279
return redirectInfo;
269280
}
270281

282+
@Override
283+
public UrlMappingData getUrlData() {
284+
return null;
285+
}
286+
271287
@Override
272288
public boolean equals(Object o) {
273289
if (this == o) return true;

grails-web-url-mappings/src/main/groovy/org/grails/web/mapping/ForwardUrlMappingInfo.groovy

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
*/
1616
package org.grails.web.mapping
1717

18+
import grails.web.mapping.UrlMappingData
1819
import groovy.transform.CompileStatic
1920

2021
/**
@@ -64,4 +65,9 @@ class ForwardUrlMappingInfo extends AbstractUrlMappingInfo {
6465
boolean isParsingRequest() {
6566
return false
6667
}
68+
69+
@Override
70+
UrlMappingData getUrlData() {
71+
null
72+
}
6773
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package org.grails.web.mapping
2+
3+
import grails.core.GrailsApplication
4+
import grails.web.mapping.UrlMappingData
5+
import grails.web.mapping.UrlMappingInfo
6+
import spock.lang.Specification
7+
8+
class UrlMappingUtilsSpec extends Specification {
9+
10+
def "test buildDispatchUrlForMapping"() {
11+
when:
12+
UrlMappingData urlData = new ResponseCodeMappingData("500")
13+
UrlMappingInfo info = new DefaultUrlMappingInfo([controller: 'error', action: 'logError'], urlData, null)
14+
String dispatchUrl = UrlMappingUtils.buildDispatchUrlForMapping(info, true)
15+
16+
then:
17+
dispatchUrl == 'fresa'
18+
}
19+
}

0 commit comments

Comments
 (0)