Ace - cheers! On Mon, Nov 2, 2009 at 3:13 PM, Magnus Holm <[email protected]> wrote:
> Okay, I think we're actually fine by setting :path => "/" by default. > If you want anything different, you should use "use > Rack::Session::Cookie" yourself. > > //Magnus Holm > > > > On Mon, Oct 19, 2009 at 19:14, Jonathan Hickford > <[email protected]<jonathan.hickford%[email protected]>> > wrote: > > Hi, > > > > I'd be inclined to agree with the middleware approach too, especially > > if it's pre 2.0 release and that change can be made along side other > > 1.5 -> 2.0 changes > > > > Jon > > > >> On Sun, Oct 18, 2009 at 9:31 PM, Magnus Holm <[email protected]> wrote: > >>> Wow, great catch! This is definitely a bug. I guess this should go to > >>> GitHub issues, yes. > >>> > >>> This is actually an issue where Camping and Rack::Session::Cookie > fight: > >>> > >>> At the first request, sessions.state is set in ::Cookie after Camping > >>> has done its magic. > >>> > >>> At the second request, Camping loads @state from @env['rack.state'], > >>> the app changes the session, but @cookie['sessions.state'] stays > >>> intact. Camping's #to_a then sets the cookies again in the response: > >>> > >>> @cookies.each do |k, v| > >>> v = {:value => v, :path => self / "/"} if String === v > >>> r.set_cookie(k, v) > >>> end > >>> > >>> Which means that it sets a sessions.state-cookie at /sessions/. Then > >>> ::Cookies kicks in and figures out that the sessions have changed and > >>> sets a new cookie, but this time at /. (This also has the effect that > >>> Camping copies all the cookies at / into /sessions/) > >>> > >>> At the third request, Rack chooses cookies "such that those with more > >>> specific Path attributes precede those with less specific", and the > >>> cookie at /sessions/ wins. > >>> > >>> Your fix won't unfornately work because @root is only available inside > >>> a request/controller. > >>> > >>> I think we need to do two things: > >>> * Make sure Camping only sets cookies when they've changed. > >>> * Figure out a way to set :path to SCRIPT_NAME. If so, this should > >>> only be an option, as you might also want to mount two apps and have > >>> them share the sessions (aka :path => '/'). > >>> > >>> I'm not quite sure how we should add that option, though. We could > >>> switch Camping::Session to be a middleware, but this means all apps > >>> will have to change "include Camping::Session" to "use > >>> Camping::Session". It's maybe not such a big deal? We should at least > >>> do these kind of changes *before* the release of 2.0. > >>> > >>> Some examples: > >>> > >>> # Middleware > >>> use Camping::Session, :secret => "foo", :shared => true > >>> > >>> # Subclass > >>> include Camping::Session::Shared > >>> secret "foo" > >>> > >>> # New method > >>> include Camping::Session > >>> secret "foo" > >>> shared_cookie! > >>> > >>> # Merge #secret and #shared_cookie! together > >>> include Camping::Session > >>> session_options :secret => "foo", :shared => true > >>> > >>> > >>> I think I actually prefer the middleware-version. It's short and > >>> concise and can be extended with more options if needed. > >>> > >>> What do you think? > >>> > >>> > >>> //Magnus Holm > >>> > >>> > >>> > >>> On Sun, Oct 18, 2009 at 19:59, Jonathan Hickford > >>> <[email protected]<jonathan.hickford%[email protected]>> > wrote: > >>>> Hi all, > >>>> > >>>> Not sure where best to raise this (github issues?) but I'm seeing an > >>>> issue with the cookie sessions in camping 2.0 using rack. If I mount > >>>> an app such as the example blog or the sessions test app at any url > >>>> that is not the root session information is lost in some cases. Same > >>>> thing happens if I use the built in Camping server. > >>>> > >>>> For example if I mount the blog app using rackup at '/blog' I'm unable > >>>> to log in. If I mount the sessions test app the information added on > >>>> the second page is lost when it reaches page three. Looking at the > >>>> cookies in the browser I can see two state cookies set with the paths > >>>> '/' and '/blog/'. > >>>> > >>>> I'm guessing this is to do with Rack::Session::Cookie in session.rb, > >>>> which will default to use :path => '/' in all cases. If I explicitly > >>>> add :path => '/blog/' there it starts working as expected. Some more > >>>> detailed outputs here (this will run from /test) > >>>> http://pastebin.com/m6c13a4aa > >>>> > >>>> Is that me doing something crazy there (I'm not expert!) or is that a > >>>> bug? If that's an issue I think the below change to session.rb fixes > >>>> it, passing in the apps @root into the path Rack's session cookie > >>>> middleware. I can push that somewhere if we reckon that's a fix? > >>>> > >>>> - app.use Rack::Session::Cookie, :key => key, :secret => secret > >>>> + app.use Rack::Session::Cookie, :key => key, :secret => secret, :path > => @root > >>>> > >>>> Regards, > >>>> > >>>> Jon > >>>> _______________________________________________ > >>>> Camping-list mailing list > >>>> [email protected] > >>>> http://rubyforge.org/mailman/listinfo/camping-list > >>>> > >>> _______________________________________________ > >>> Camping-list mailing list > >>> [email protected] > >>> http://rubyforge.org/mailman/listinfo/camping-list > >> > > _______________________________________________ > > Camping-list mailing list > > [email protected] > > http://rubyforge.org/mailman/listinfo/camping-list > > > _______________________________________________ > Camping-list mailing list > [email protected] > http://rubyforge.org/mailman/listinfo/camping-list >
_______________________________________________ Camping-list mailing list [email protected] http://rubyforge.org/mailman/listinfo/camping-list

