[mod_python] Is external redirect supposed to send acookie(mpservlets)?

Graham Dumpleton grahamd at dscpl.com.au
Mon Jun 20 19:09:41 EDT 2005


Is the problem perhaps that you are using:

  self.external_redirect(...)

and not:

  util.redirect(...)

In util.redirect(), it writes actual page content out and this may
trigger the flushing out of any headers that have been set indirectly
by Session for cookies.

In self.external_redirect() of mpservlets() it neither flushes the
headers or writes any content and so cookie headers may not
get written.

Graham

Graham Dumpleton wrote ..
> Scott Sanders wrote ..
> > The session cookie is not in the error headers, which are the only  
> > headers sent on redirect.  My workaround was to write a redirect  
> > function that wrote out the session cookie in the error headers.  I 
> > will try and look for the source code.
> 
> Hmmm, that doesn't quite make sense. I use util.redirect() with a
> session based login and have no problem at all. You might be able
> to learn something from:
> 
>   http://svn.dscpl.com.au/vampire/trunk/examples/session/access.py
>   http://svn.dscpl.com.au/vampire/trunk/examples/session/
> 
> Working example at:
> 
>   http://www.dscpl.com.au/projects/vampire/examples/session
> 
> Use mickey/mouse as login/password.
> 
> I know it isn't using mpservlets and relies on a different package,
> but might still be useful.
> 
> Graham
> 
> > On Jun 20, 2005, at 12:08 PM, Scott Chapman wrote:
> > 
> > > Hi!
> > >
> > > I'm having problems with session cookies and redirects.  Can this be
> > > resolved or is this the way things work?
> > >
> > > If a user requests a page that requires a login login and they are
> not
> > > logged in (and they have no cookies), I automatically redirect
> > > (external) them to the login screen, after setting a "returnto"  
> > > session
> > > entry.  The returnto is lost because the cookie is not sent with  
> > > the 302
> > > response.
> > >
> > > Here's code in my auth method that sets the session returnto value
> and
> > > redirects them:
> > >
> > >
> > >> if requiresLogin:
> > >>     self.req.log_error('AUTH - page: %s requires login' % methodName)
> > >>     userID = self.session.get('userid', None)
> > >>     # Check to see if the user is logged in
> > >>     if not userID:
> > >>         self.req.log_error('AUTH - user not logged in')
> > >>         self.session['returnto'] = self.req.unparsed_uri
> > >>         self.req.log_error('AUTH - sid when returnto set: ' + str
> > >> (self.session.id()))
> > >>         self.req.log_error('AUTH - returnto: ' + self.session 
> > >> ['returnto'])
> > >>         self.req.log_error('AUTH - external redirect to login')
> > >>         self.external_redirect('/login')
> > >>
> > >
> > > Here's the code in my /login screen which is supposed to catch the
> > > returnto and send them on their way:
> > >
> > >
> > >> user_id = data_object.checkLoginAndPassword(login, password)
> > >> if user_id:
> > >>     # The login information is valid.
> > >>     uberServlet.session['userid'] = user_id
> > >>     uberServlet.req.log_error('LOGIN - username and password  
> > >> confirmed')
> > >>     uberServlet.req.log_error('LOGIN - userid,email: %s, %s' %  
> > >> (user_id,login))
> > >>     uberServlet.req.log_error('LOGIN - session id: ' + str 
> > >> (uberServlet.session.id()))
> > >>     return_to = uberServlet.session.pop('returnto: ','/index')
> > >>     uberServlet.req.log_error('LOGIN - return_to' + return_to)
> > >>     util.redirect(uberServlet.req,return_to)
> > >>
> > >
> > > Here's the log:
> > >
> > >
> > >> HANDLER-calling prep
> > >> HANDLER-calling auth
> > >> AUTH - methodName: change_password
> > >> AUTH - method found
> > >> AUTH - page: change_password requires login
> > >> AUTH - user not logged in
> > >> AUTH - sid when returnto set: 82d588854c0a23ac67c7f986ab86ad79
> > >> AUTH - returnto: /change_password
> > >> AUTH - external redirect to login
> > >> HANDLER-calling prep
> > >> HANDLER-calling auth
> > >> AUTH - methodName: login
> > >> HANDLER-calling respond
> > >> UBERSERVLET RESPOND - method name: login
> > >> UBERSERVLET RESPOND - calling method
> > >> HANDLER-calling wrapup
> > >> =========== login screen ===========
> > >> HANDLER-calling prep, referer: http://nsnserver/login
> > >> HANDLER-calling auth, referer: http://nsnserver/login
> > >> AUTH - methodName: login, referer: http://nsnserver/login
> > >> HANDLER-calling respond, referer: http://nsnserver/login
> > >> UBERSERVLET RESPOND - Converting form to dict, referer: http:// 
> > >> nsnserver/login
> > >> UBERSERVLET RESPOND - Form Entry Type: <class  
> > >> 'mod_python.util.StringField'>, referer: http://nsnserver/login
> > >> UBERSERVLET RESPOND - key: login, referer: http://nsnserver/login
> > >> UBERSERVLET RESPOND - Single Item, referer: http://nsnserver/login
> > >> UBERSERVLET RESPOND - Form Entry Type: <class  
> > >> 'mod_python.util.StringField'>, referer: http://nsnserver/login
> > >> UBERSERVLET RESPOND - key: password, referer: http://nsnserver/login
> > >> UBERSERVLET RESPOND - Single Item, referer: http://nsnserver/login
> > >> UBERSERVLET RESPOND - form dict: {'login': 'scott at mischko.com',  
> > >> 'password': 'letmein'}, referer: http://nsnserver/login
> > >> UBERSERVLET RESPOND - method name: login, referer: http:// 
> > >> nsnserver/login
> > >> UBERSERVLET RESPOND - calling method, referer: http://nsnserver/login
> > >> LOGIN - username and password confirmed, referer: http://nsnserver/
> > >> login
> > >> LOGIN - userid,email: 1, scott at mischko.com, referer: http:// 
> > >> nsnserver/login
> > >> LOGIN - session id: e17247d6be677abadf19748044acb0bf, referer:  
> > >> http://nsnserver/login
> > >> LOGIN - return_to/index, referer: http://nsnserver/login
> > >> HANDLER-calling prep, referer: http://nsnserver/login
> > >> HANDLER-calling auth, referer: http://nsnserver/login
> > >> AUTH - methodName: index, referer: http://nsnserver/login
> > >> AUTH - method found, referer: http://nsnserver/login
> > >> AUTH - page: index does not require login, referer: http:// 
> > >> nsnserver/login
> > >> HANDLER-calling respond, referer: http://nsnserver/login
> > >> UBERSERVLET RESPOND - method name: index, referer: http:// 
> > >> nsnserver/login
> > >> UBERSERVLET RESPOND - calling method, referer: http://nsnserver/login
> > >> HANDLER-calling wrapup, referer: http://nsnserver/login
> > >>
> > >
> > >
> > > And here's the HTTP live capture of headers:
> > >
> > >
> > >> http://nsnserver/ 
> > >> change_password                                                  
> > >>                                                                  
> > >>                                                            GET / 
> > >> change_password HTTP/ 
> > >> 1.1                                                              
> > >>             Host:  
> > >> nsnserver                                                        
> > >>                                 User-Agent: Mozilla/5.0 (Windows;
> > >> U; Windows NT 5.1; en-US; rv:1.7.8) Gecko/20050511 Firefox/ 
> > >> 1.0.4         Accept: text/xml,application/xml,application/xhtml 
> > >> +xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
> > >> Accept-Language: en- 
> > >> us,en;q=0.5                                                      
> > >>                   Accept-Encoding:  
> > >> gzip,deflate                                                     
> > >>                      Accept-Charset:  
> > >> ISO-8859-1,utf-8;q=0.7,*;q=0.7                                   
> > >>                       Keep-Alive:  
> > >> 300                                                              
> > >>                           Connection: keep- 
> > >> alive                                                            
> > >>                                                                  
> > >>                                                            HTTP/ 
> > >> 1.x 302  
> > >> Found                                                            
> > >>                          Date: Fri, 17 Jun 2005 21:50:24  
> > >> GMT                                                              
> > >>       Server: Apache/2.0.53 (Unix) mod_ssl/2.0.53 OpenSSL/0.9.7d 
> > >> mod_python/3.1.4 Python/2.4.1c2 PHP/4.3.10      Location: / 
> > >> login                                                            
> > >>                            Content-Length:  
> > >> 336                                                              
> > >>                       Keep-Alive: timeout=15,  
> > >> max=100                                                          
> > >>               Connection: Keep- 
> > >> Alive                                                            
> > >>                      Content-Type: text/html;  
> > >> charset=iso-8859-1                                               
> > >>               
> > >> ----------------------------------------------------------       
> > >>                                       http://nsnserver/ 
> > >> login                                                            
> > >>                                                                  
> > >>                                                            GET / 
> > >> login HTTP/ 
> > >> 1.1                                                              
> > >>                       Host:  
> > >> nsnserver                                                        
> > >>                                 User-Agent: Mozilla/5.0 (Windows;
> > >> U; Windows NT 5.1; en-US; rv:1.7.8) Gecko/20050511 Firefox/ 
> > >> 1.0.4         Accept: text/xml,application/xml,application/xhtml 
> > >> +xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
> > >> Accept-Language: en- 
> > >> us,en;q=0.5                                                      
> > >>                   Accept-Encoding:  
> > >> gzip,deflate                                                     
> > >>                      Accept-Charset:  
> > >> ISO-8859-1,utf-8;q=0.7,*;q=0.7                                   
> > >>                       Keep-Alive:  
> > >> 300                                                              
> > >>                           Connection: keep- 
> > >> alive                                                            
> > >>                                                                  
> > >>                                                            HTTP/ 
> > >> 1.x 200  
> > >> OK                                                               
> > >>                          Date: Fri, 17 Jun 2005 21:50:25  
> > >> GMT                                                              
> > >>       Server: Apache/2.0.53 (Unix) mod_ssl/2.0.53 OpenSSL/0.9.7d 
> > >> mod_python/3.1.4 Python/2.4.1c2 PHP/4.3.10      Cache-Control: no-
> > >> cache="set- 
> > >> cookie"                                                          
> > >>          Set-Cookie: pysid=e17247d6be677abadf19748044acb0bf;  
> > >> path=/                                                 Keep-Alive:
> > >> timeout=15,  
> > >> max=99                                                           
> > >>               Connection: Keep- 
> > >> Alive                                                            
> > >>                      Transfer-Encoding:  
> > >> chunked                                                          
> > >>                    Content-Type: text/ 
> > >> html                                                             
> > >>                     
> > >> ----------------------------------------------------------       
> > >>                                       ==========login screen in  
> > >> web browser here=====================
> > >> http://nsnserver/login
> > >> POST /login HTTP/1.1
> > >> Host: nsnserver
> > >> User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv: 
> > >> 1.7.8) Gecko/20050511 Firefox/1.0.4
> > >> Accept: text/xml,application/xml,application/xhtml+xml,text/ 
> > >> html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
> > >> Accept-Language: en-us,en;q=0.5
> > >> Accept-Encoding: gzip,deflate
> > >> Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
> > >> Keep-Alive: 300
> > >> Connection: keep-alive
> > >> Referer: http://nsnserver/login
> > >> Cookie: pysid=e17247d6be677abadf19748044acb0bf;  
> > >> testSessionCookie=Enabled
> > >> Content-Type: application/x-www-form-urlencoded
> > >> Content-Length: 42
> > >> login=scott%40mischko.com&password=letmein
> > >> HTTP/1.x 302 Found
> > >> Date: Fri, 17 Jun 2005 21:51:12 GMT
> > >> Server: Apache/2.0.53 (Unix) mod_ssl/2.0.53 OpenSSL/0.9.7d  
> > >> mod_python/3.1.4 Python/2.4.1c2 PHP/4.3.10
> > >> Location: /index
> > >> Keep-Alive: timeout=15, max=100
> > >> Connection: Keep-Alive
> > >> Transfer-Encoding: chunked
> > >> Content-Type: text/plain
> > >> ----------------------------------------------------------
> > >> http://nsnserver/index
> > >> GET /index HTTP/1.1
> > >> Host: nsnserver
> > >> User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv: 
> > >> 1.7.8) Gecko/20050511 Firefox/1.0.4
> > >> Accept: text/xml,application/xml,application/xhtml+xml,text/ 
> > >> html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
> > >> Accept-Language: en-us,en;q=0.5
> > >> Accept-Encoding: gzip,deflate
> > >> Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
> > >> Keep-Alive: 300
> > >> Connection: keep-alive
> > >> Referer: http://nsnserver/login
> > >> Cookie: pysid=e17247d6be677abadf19748044acb0bf;  
> > >> testSessionCookie=Enabled
> > >> HTTP/1.x 200 OK
> > >> Date: Fri, 17 Jun 2005 21:51:14 GMT
> > >> Server: Apache/2.0.53 (Unix) mod_ssl/2.0.53 OpenSSL/0.9.7d  
> > >> mod_python/3.1.4 Python/2.4.1c2 PHP/4.3.10
> > >> Keep-Alive: timeout=15, max=100
> > >> Connection: Keep-Alive
> > >> Transfer-Encoding: chunked
> > >> Content-Type: text/html
> > >>
> > >
> > >
> > >
> > > _______________________________________________
> > > Mod_python mailing list
> > > Mod_python at modpython.org
> > > http://mailman.modpython.org/mailman/listinfo/mod_python
> > >
> > 
> > _______________________________________________
> > Mod_python mailing list
> > Mod_python at modpython.org
> > http://mailman.modpython.org/mailman/listinfo/mod_python
> _______________________________________________
> Mod_python mailing list
> Mod_python at modpython.org
> http://mailman.modpython.org/mailman/listinfo/mod_python


More information about the Mod_python mailing list