Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Grails redirects to wrong address when using app.context?

I'm noticing some odd behavior with redirect when I set my app.context a certain way. I found a bug in the Grails JIRA which describes my problem perfectly, but it was marked as UTR: http://jira.grails.org/browse/GRAILS-7546


Here is my description of the problem:
I'm currently using Grails 2.0M2. I have the following properties defined in my application.properties file:

app.context=/
app.name=foobar

When I call redirect in a controller, redirect is adding the app name onto the uri I provide, which then causes a 404. Here is how I'm doing this:

String partialUrl = createLink(mapping: 'helloworld') // returns `/hello/world`
redirect(uri: partialUrl) // INCORRECTLY redirects to 
                          // `http://mysite.com/foobar/hello/world`
                          // instead of `http://mysite.com/hello/world`

Assume that I have a URL mapping named helloworld defined in my UrlMappings.groovy file with a path of /hello/world.

So, long story short, if I set the app.context to /, I would NOT expect the app.name to show up in my final redirect URL.

Is this a bug or expected behavior? Any idea on the easiest way I could build up the redirect URL without doing too many manual steps?

like image 560
Polaris878 Avatar asked Nov 04 '22 11:11

Polaris878


2 Answers

I hate to say it, but I cannot reproduce it either. I created a test project with one controller (named Hello), using your code to create an action that does nothing but redirect:

HelloController.groovy

package test1

class HelloController {
   def index() {
      def model = [:]
      model.content = 'content...'
      model
   }

   def redir() {
      String partialUrl = createLink(mapping: 'helloworld') // returns `/hello/world`
      redirect(uri: partialUrl) // INCORRECTLY redirects to 
                            // `http://mysite.com/foobar/hello/world`
                            // instead of `http://mysite.com/hello/world`
   }
}

I created an index page, index.gsp in the views/hello

index.gsp

<h1>index.gsp</h1>
<html>
   <body>
      <p>This data is coming from the model:</p>
      <p>content: ${content}</p>
   </body>
</html>

Setup helloworld in the UrlMappings to map to the index action of the hello controller:

UrlMappings.groovy

class UrlMappings {
    static mappings = {
        "/helloworld"(controller: "hello", action: "index")

        "/$controller/$action?/$id?"{
            constraints {
                // apply constraints here
            }
        }

        "/"(view:"/index")
        "500"(view:'/error')
    }
}

And changed the application.properties to have the app.context=/

application.properties

#Grails Metadata file
#Sun Nov 06 14:51:56 EST 2011
app.grails.version=2.0.0.RC1
app.context=/
app.name=test1
app.servlet.version=2.5
app.version=0.1

When I ran the app, I could go to localhost:8080/hello and it would show my simple GSP. I tried localhost:8080/helloworld and also got it as expected per the mapping. Then I tried localhost:8080/hello/redir and I was properly redirected to localhost:8080/helloworld.

However, if you're still facing this issue, I have a few suggestions 1) Try using the new link generator available in 2.0 instead of createLink. It may not do anything different, but worth a try: grailsLinkGenerator.link(mapping: 'helloworld') 2) If it's only on redirects from within controllers, you could just add the http://mysite.com portion yourself to the partialUrl. 3) Last resort, write a Filter attached to afterView that does a regex search and replace on the contents for mysite.com/foobar. Not sure this will catch redirects though, but if anything would, I'd assume this would be it since filters can be applied at broad level.

like image 172
Todd Avatar answered Nov 15 '22 06:11

Todd


  def yourAction = {

       redirect(uri:"helloworld")

  }

That doesnt work for you?

like image 40
mjs Avatar answered Nov 15 '22 04:11

mjs