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..bd219889a80 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(!isAbsoluteUri(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. */