diff --git a/grails-test-suite-web/src/test/groovy/org/codehaus/groovy/grails/web/taglib/ApplicationTagLibTests.groovy b/grails-test-suite-web/src/test/groovy/org/codehaus/groovy/grails/web/taglib/ApplicationTagLibTests.groovy index 3cb69cee297..f6710d0584e 100644 --- a/grails-test-suite-web/src/test/groovy/org/codehaus/groovy/grails/web/taglib/ApplicationTagLibTests.groovy +++ b/grails-test-suite-web/src/test/groovy/org/codehaus/groovy/grails/web/taglib/ApplicationTagLibTests.groovy @@ -796,4 +796,22 @@ class ApplicationTagLibTests extends AbstractGrailsTagTests { appCtx.getBean(FormTagLib.name).requestDataValueProcessor = null } } + + void testCreateLinkWithUriAndParams() { + unRegisterRequestDataValueProcessor() + def template = '''''' + assertOutputEquals '/some/path?width=21&height=12', template + } + + void testCreateLinkWithParamsAndUriContainsRequestParams() { + unRegisterRequestDataValueProcessor() + def template = '''''' + assertOutputEquals '/some/path?name=JSB&width=21&height=12', template + } + + void testUrlEncodingParamsCreateLinkWithUri() { + unRegisterRequestDataValueProcessor() + def template = '''''' + assertOutputEquals '/some/path?some+height=12&name=Jeff+Brown', template + } } diff --git a/grails-web/src/main/groovy/org/codehaus/groovy/grails/web/mapping/DefaultLinkGenerator.groovy b/grails-web/src/main/groovy/org/codehaus/groovy/grails/web/mapping/DefaultLinkGenerator.groovy index d3ef516bcd5..ac871708836 100644 --- a/grails-web/src/main/groovy/org/codehaus/groovy/grails/web/mapping/DefaultLinkGenerator.groovy +++ b/grails-web/src/main/groovy/org/codehaus/groovy/grails/web/mapping/DefaultLinkGenerator.groovy @@ -17,6 +17,7 @@ package org.codehaus.groovy.grails.web.mapping import grails.util.Environment import grails.util.GrailsNameUtils +import grails.util.GrailsWebUtil import grails.web.UrlConverter import groovy.transform.CompileStatic import groovy.transform.TypeCheckingMode @@ -105,7 +106,21 @@ class DefaultLinkGenerator implements LinkGenerator, PluginManagerAware { writer << cp } } - writer << attrs.get(ATTRIBUTE_URI).toString() + def uri = attrs.get(ATTRIBUTE_URI).toString() + writer << uri + + def paramsAttribute = attrs.get(ATTRIBUTE_PARAMS) + Map params = paramsAttribute && (paramsAttribute instanceof Map) ? (Map)paramsAttribute : null + if(params) { + def charset = GrailsWebUtil.DEFAULT_ENCODING + def paramString = params.collect { k, v -> + def encodedKey = URLEncoder.encode(k as String, charset) + def encodedValue = URLEncoder.encode(v as String, charset) + "$encodedKey=$encodedValue" + }.join('&') + writer << (uri.indexOf('?') >= 0 ? '&' : '?') + writer << paramString + } } else if (attrs.get(ATTRIBUTE_RELATIVE_URI) != null) { String relativeUri = attrs.get(ATTRIBUTE_RELATIVE_URI)