Skip to content

Commit 8ef3dd6

Browse files
author
graeme
committed
fix for double context path issue in web flows
git-svn-id: https://svn.codehaus.org/grails/trunk@6486 1cfb16fd-6d17-0410-8ff1-b7e8e1e2867d
1 parent 94d8c8a commit 8ef3dd6

File tree

5 files changed

+53
-16
lines changed

5 files changed

+53
-16
lines changed

src/groovy/org/codehaus/groovy/grails/webflow/engine/builder/FlowBuilder.groovy

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -319,7 +319,7 @@ class FlowInfoCapturer {
319319
if(args.id) params.id = args.id
320320

321321
UrlCreator urlCreator = urlMapper.getReverseMapping( controller, args.action, params );
322-
def url = urlCreator.createURL(controller, args.action, params, 'utf-8')
322+
def url = urlCreator.createRelativeURL(controller, args.action, params, 'utf-8')
323323
redirectUrl = "externalRedirect:$url"
324324
}
325325
}

src/web/org/codehaus/groovy/grails/web/mapping/DefaultUrlCreator.java

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ public DefaultUrlCreator(String controller, String action) {
5353
public String createURL(Map parameterValues, String encoding) {
5454
if(parameterValues == null) parameterValues = Collections.EMPTY_MAP;
5555
GrailsWebRequest webRequest = (GrailsWebRequest) RequestContextHolder.currentRequestAttributes();
56-
return createURLWithWebRequest(parameterValues, webRequest);
56+
return createURLWithWebRequest(parameterValues, webRequest, true);
5757
}
5858

5959
public String createURL(Map parameterValues, String encoding, String fragment) {
@@ -62,15 +62,15 @@ public String createURL(Map parameterValues, String encoding, String fragment) {
6262

6363
}
6464

65-
private String createURLWithWebRequest(Map parameterValues, GrailsWebRequest webRequest) {
65+
private String createURLWithWebRequest(Map parameterValues, GrailsWebRequest webRequest, boolean includeContextPath) {
6666
HttpServletRequest request = webRequest.getCurrentRequest();
6767

6868
String id = null;
6969
if(parameterValues.containsKey(ARGUMENT_ID)) {
7070
id = parameterValues.get(ARGUMENT_ID).toString();
7171
}
7272

73-
StringBuffer actualUriBuf = new StringBuffer(webRequest.getAttributes().getApplicationUri(request));
73+
StringBuffer actualUriBuf = includeContextPath ? new StringBuffer(webRequest.getAttributes().getApplicationUri(request)) : new StringBuffer();
7474
if(actionName != null) {
7575

7676
if(actionName.indexOf(SLASH) > -1) {
@@ -94,18 +94,22 @@ private String createURLWithWebRequest(Map parameterValues, GrailsWebRequest web
9494
}
9595

9696
public String createURL(String controller, String action, Map parameterValues, String encoding) {
97+
return createURLInternal(controller, action, parameterValues, true );
98+
}
99+
100+
private String createURLInternal(String controller, String action, Map parameterValues, boolean includeContextPath) {
97101
GrailsWebRequest webRequest = (GrailsWebRequest) RequestContextHolder.currentRequestAttributes();
98102
boolean blankController = StringUtils.isBlank(controller);
99103
boolean blankAction = StringUtils.isBlank(action);
100-
104+
101105
if(!blankController) {
102106
parameterValues.put( GrailsControllerClass.CONTROLLER, controller );
103107
}
104108
if(!blankAction)
105109
parameterValues.put( GrailsControllerClass.ACTION, action );
106110

107111
try {
108-
return createURLWithWebRequest(parameterValues, webRequest);
112+
return createURLWithWebRequest(parameterValues, webRequest, includeContextPath);
109113
}
110114
finally {
111115
if(!blankController)
@@ -115,6 +119,10 @@ public String createURL(String controller, String action, Map parameterValues, S
115119
}
116120
}
117121

122+
public String createRelativeURL(String controller, String action, Map parameterValues, String encoding) {
123+
return createURLInternal(controller, action, parameterValues, false );
124+
}
125+
118126
public String createURL(String controller, String action, Map parameterValues, String encoding, String fragment) {
119127
String url = createURL(controller, action, parameterValues, encoding);
120128
return createUrlWithFragment(encoding, fragment, url);

src/web/org/codehaus/groovy/grails/web/mapping/RegexUrlMapping.java

Lines changed: 24 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -168,16 +168,22 @@ public UrlMappingInfo match(String uri) {
168168
* @see org.codehaus.groovy.grails.web.mapping.UrlMapping
169169
*/
170170
public String createURL(Map parameterValues, String encoding) {
171+
return createURLInternal(parameterValues, encoding, true);
172+
}
173+
174+
private String createURLInternal(Map parameterValues, String encoding, boolean includeContextPath) {
171175
ServletContext servletContext = ServletContextHolder.getServletContext();
172-
String contextPath;
173-
if(servletContext != null) {
174-
contextPath = servletContext.getContextPath();
175-
}
176-
else {
177-
GrailsWebRequest webRequest = (GrailsWebRequest) RequestContextHolder.currentRequestAttributes();
178-
contextPath = webRequest.getAttributes().getApplicationUri(webRequest.getCurrentRequest());
176+
String contextPath = "";
177+
if(includeContextPath) {
178+
if(servletContext != null) {
179+
contextPath = servletContext.getContextPath();
180+
}
181+
else {
182+
GrailsWebRequest webRequest = (GrailsWebRequest) RequestContextHolder.currentRequestAttributes();
183+
contextPath = webRequest.getAttributes().getApplicationUri(webRequest.getCurrentRequest());
184+
}
179185
}
180-
if(parameterValues==null)parameterValues=Collections.EMPTY_MAP;
186+
if(parameterValues==null)parameterValues= Collections.EMPTY_MAP;
181187
StringBuffer uri = new StringBuffer(contextPath);
182188
Set usedParams = new HashSet();
183189

@@ -206,7 +212,7 @@ else if(value == null)
206212

207213
if(LOG.isDebugEnabled()) {
208214
LOG.debug("Created reverse URL mapping ["+uri.toString()+"] for parameters ["+parameterValues+"]");
209-
}
215+
}
210216
return uri.toString();
211217
}
212218

@@ -216,6 +222,10 @@ public String createURL(Map parameterValues, String encoding, String fragment) {
216222
}
217223

218224
public String createURL(String controller, String action, Map parameterValues, String encoding) {
225+
return createURLInternal(controller, action, parameterValues, encoding, true);
226+
}
227+
228+
private String createURLInternal(String controller, String action, Map parameterValues, String encoding, boolean includeContextPath) {
219229
if(parameterValues == null) parameterValues = new HashMap();
220230

221231
boolean hasController = !StringUtils.isBlank(controller);
@@ -228,7 +238,7 @@ public String createURL(String controller, String action, Map parameterValues, S
228238
if(hasAction)
229239
parameterValues.put(ACTION, action);
230240

231-
return createURL(parameterValues, encoding);
241+
return createURLInternal(parameterValues, encoding, includeContextPath);
232242
} finally {
233243
if(hasController)
234244
parameterValues.remove(CONTROLLER);
@@ -238,6 +248,10 @@ public String createURL(String controller, String action, Map parameterValues, S
238248
}
239249
}
240250

251+
public String createRelativeURL(String controller, String action, Map parameterValues, String encoding) {
252+
return createURLInternal(controller, action, parameterValues, encoding, false);
253+
}
254+
241255
public String createURL(String controller, String action, Map parameterValues, String encoding, String fragment) {
242256
String url = createURL(controller, action, parameterValues, encoding);
243257
return createUrlWithFragment(url, fragment, encoding);

src/web/org/codehaus/groovy/grails/web/mapping/ResponseCodeUrlMapping.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,10 @@ public String createURL(String controller, String action, Map parameterValues, S
8989
throw new UnsupportedOperationException("Method createURL not implemented in " + getClass());
9090
}
9191

92+
public String createRelativeURL(String controller, String action, Map parameterValues, String encoding) {
93+
throw new UnsupportedOperationException("Method createRelativeURL not implemented in " + getClass());
94+
}
95+
9296
public String createURL(String controller, String action, Map parameterValues, String encoding, String fragment) {
9397
throw new UnsupportedOperationException("Method createURL not implemented in " + getClass());
9498
}

src/web/org/codehaus/groovy/grails/web/mapping/UrlCreator.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,17 @@ public interface UrlCreator {
6363
String createURL(String controller, String action, Map parameterValues, String encoding);
6464

6565

66+
/**
67+
* Creates a URL for the given parameters values, controller and action names without the context path information
68+
*
69+
* @param controller The controller name
70+
* @param action The action name
71+
* @param parameterValues The parameter values
72+
* @param encoding The encoding to use for parameters
73+
* @return The created URL for the given arguments
74+
*/
75+
String createRelativeURL(String controller, String action, Map parameterValues, String encoding);
76+
6677
/**
6778
* Creates a URL for the given parameters values, controller and action names
6879
*

0 commit comments

Comments
 (0)