From: "Larry Leszczynski" <[email protected]>
Hi Octavian -
> Not sure if this gets you all the way there, but you could call
> "c.req.uri" with no arguments, that should give you the current request
> including base, path and query string.  Then you could strip off
> c.req.base from the beginning of that string.

Thank you Larry, but the problem is that the base was overwritten and it
contains some more than the uri, so I can't cut it from the URI.

It should work fine, we do something very similar.  The trick is that
after the prepare_path fixup (if you did it like in the wiki), when you
stringify c.req.uri, it will reflect the *new* base, not the original.
Using your example:

  original request url:    http://www.site.com/prg?var1=val1&var2=val2
  rewritten request url:
  http://www.site.com/en/prg?var1=val1&var2=val2

So you should have:

  [%
     uri  = c.req.uri;     #
     http://www.site.com/en/prg?var1=val1&var2=val2
     base = c.req.base;    # http://www.site.com/en/

     pattern = '^' _ base;                        # pattern not
     tested...
     path_and_query = uri.replace(pattern, '');
  %]

So it's easy to strip "base" from the front of "uri" and get what you
need, without knowing what "base" is.

**

Thank you Larry. Finally I've done it this way.

I didn't know that c.req.uri is not just a string, but an object that has
its own methods, and c.req.uri.path_query was the one I needed.

This could work, but given the same original url and prepare_path fixup,
you will have:

  [%
     uri = c.req.uri;                         #
     http://www.site.com/en/prg?var1=val1&var2=val2
     path_and_query = c.req.uri.path_query;   #
     /en/prg?var1=val1&var2=val2
  %]

So now when you build the new url you have to be aware that
path_and_query contains the "/en" part that needs to be stripped.
Larry

**
Oh yes, I found that so I've used the solution you proposed.

Now I use the following line in prepare_path() for every request:

$c->request->uri->path("$language/" . $c->request->path);

so the URI is always overwritten and it contains the language indicator.
I had previously used that line like

unless(@path_chunks && $valid_languages{$path_chunks[0]}) {
$c->request->uri->path("$language/" . $c->request->path);
}

and in that case the URI wasn't containing the language indicator when the original URI was without a language indicator, but the base was always containing it.

But now it seems to work fine.

Thank you.

Octavian


_______________________________________________
List: [email protected]
Listinfo: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/catalyst
Searchable archive: http://www.mail-archive.com/[email protected]/
Dev site: http://dev.catalyst.perl.org/

Reply via email to