From a6f056d5c8b73acdec6502ebb87055c2158d12f1 Mon Sep 17 00:00:00 2001 From: Craig Andrews Date: Thu, 17 Apr 2014 13:10:37 -0400 Subject: [PATCH] GRAILS-11333: Handle already absolute URLs When a "uri" is provided to the link method and the "absolute" parameter is true, check if the provided uri is already absolute before trying to make it absolute. --- .../web/mapping/DefaultLinkGenerator.groovy | 31 +++++++++++++------ .../web/mapping/LinkGeneratorSpec.groovy | 15 +++++++++ 2 files changed, 36 insertions(+), 10 deletions(-) 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 6bebf0d3990..6d942ce504e 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 @@ -65,17 +65,19 @@ class DefaultLinkGenerator implements LinkGenerator, PluginManagerAware{ def writer = new StringBuilder() // prefer URI attribute if (attrs.get(ATTRIBUTE_URI) != null) { - final base = handleAbsolute(attrs) - if (base != null) { - writer << base - } - else { - final cp = attrs.get(ATTRIBUTE_CONTEXT_PATH) - if (cp == null) cp = getContextPath() - if (cp != null) - writer << cp - } final uriPath = attrs.get(ATTRIBUTE_URI).toString() + if(!isUriAbsolute(uriPath)){ + final base = handleAbsolute(attrs) + if (base != null) { + writer << base + } + else { + final cp = attrs.get(ATTRIBUTE_CONTEXT_PATH) + if (cp == null) cp = getContextPath() + if (cp != null) + writer << cp + } + } writer << uriPath } else { @@ -244,6 +246,15 @@ class DefaultLinkGenerator implements LinkGenerator, PluginManagerAware{ } } + private boolean isUriAbsolute(String uri){ + try{ + return new URI(uri).absolute + }catch(Exception e){ + // assume unparseable URIs are absolute + return true + } + } + /** * Get the declared URL of the server from config, or guess at localhost for non-production. */ diff --git a/grails-web/src/test/groovy/org/codehaus/groovy/grails/web/mapping/LinkGeneratorSpec.groovy b/grails-web/src/test/groovy/org/codehaus/groovy/grails/web/mapping/LinkGeneratorSpec.groovy index 4f74c47a62e..e241c324da2 100644 --- a/grails-web/src/test/groovy/org/codehaus/groovy/grails/web/mapping/LinkGeneratorSpec.groovy +++ b/grails-web/src/test/groovy/org/codehaus/groovy/grails/web/mapping/LinkGeneratorSpec.groovy @@ -18,12 +18,27 @@ class LinkGeneratorSpec extends Specification { def baseUrl = "http://myserver.com/foo" def context = "/bar" + def someAbsoluteUrl = "http://www.grails.org/" def resource = null def linkParams = [:] def pluginManager def mainCssResource = [dir:'css', file:'main.css'] + def "Test absolute link"() { + when: + linkParams.uri = someAbsoluteUrl + linkParams.absolute = true + then: + link == someAbsoluteUrl + + when: + linkParams.uri = someAbsoluteUrl + + then: + link == someAbsoluteUrl + } + def "Test create link with root URI"() { when: linkParams.uri = '/'