]> err.no Git - sope/blobdiff - sope-appserver/NGObjWeb/WOComponentRequestHandler.m
minor improvement to WOHttpAdaptor, bumped framework revisions
[sope] / sope-appserver / NGObjWeb / WOComponentRequestHandler.m
index 0d8027ef78a1358e381ba240c66c28230c24bd59..70b5bf3f77c14b5b71611a037afd52071221cf8d 100644 (file)
@@ -4,7 +4,7 @@
   This file is part of SOPE.
 
   SOPE is free software; you can redistribute it and/or modify it under
-  the terms of the GNU Lesser General Public License as published by the
+  the terms of the GNU Lesser General Pulic License as published by the
   Free Software Foundation; either version 2, or (at your option) any
   later version.
 
 - (WOResponse *)restoreSessionWithID:(NSString *)_sid
   inContext:(WOContext *)_ctx
 {
-  WOApplication *app = [WOApplication application];
-  WOResponse *response = nil;
+  WOApplication *app;
+  WOSession *session;
   
+  app = [WOApplication application];
   if (_sid == nil) {
     // invalid session ID (or no session-ID ?!, which is no error ?) */
-    response = [app handleSessionRestorationErrorInContext:_ctx];
+    return [app handleSessionRestorationErrorInContext:_ctx];
   }
-  else {
-    WOSession *session = nil;
+  
+  if ((session = [app restoreSessionWithID:_sid inContext:_ctx]) != nil) {
+    /* awake restored session */
+    [_ctx setSession:session];
+    [session _awakeWithContext:_ctx];
     
-    if ((session = [app restoreSessionWithID:_sid inContext:_ctx])) {
-      // awake restored session
-      [_ctx setSession:session];
-      [session _awakeWithContext:_ctx];
-      
-      [session awake];
-      response = nil;
-    }
-    else {
-      response = [app handleSessionRestorationErrorInContext:_ctx];
-    }
+    [session awake];
+    return nil;
   }
-  return response;
+  
+  return [app handleSessionRestorationErrorInContext:_ctx];
 }
 
 /*
 
       session/context.element-id
   */
-  if ([handlerPath length] > 0) {
+  if ([handlerPath isNotEmpty]) {
     NSArray *spath = [_request requestHandlerPathArray];
-
+    
     if ([spath count] > 1)
       [context setRequestSenderID:[spath objectAtIndex:1]];
-    if ([spath count] > 0)
+    if ([spath isNotEmpty])
       sessionID = [spath objectAtIndex:0];
   }
   
-  if ([sessionID length] == 0)
+  if (![sessionID isNotEmpty])
     sessionID = [application sessionIDFromRequest:_request];
   
 #if 1
   [application awake];
   
   /* restore or create session */
-  if ([sessionID isNotNull]) {
-    response = [self restoreSessionWithID:sessionID inContext:context];
-    session  = response ? nil : [context session];
+  if ([sessionID isNotEmpty]) {
+    if ((response = [self restoreSessionWithID:sessionID inContext:context]))
+      session = nil;
+    else {
+      /* 
+        Note: this creates a _new_ session if the restoration handler did not
+              return a response! We check that below by comparing the session
+              IDs.
+      */
+      session = [context session];
+    }
     
-    //[self logWithFormat:@"restored session (id=%@): %@", sessionID, session];
+    [self debugWithFormat:@"restored session (id=%@): %@", sessionID, session];
+    
+    if (session && (![sessionID isEqualToString:[session sessionID]])) {
+      [self errorWithFormat:@"session-ids do not match (%@ vs %@)",
+             sessionID, [session sessionID]];
+    }
     
     if ([session isNotNull]) {
-      /* awake stored page */
-      component = [session restorePageForContextID:[context currentElementID]];
+      NSString *eid;
       
-      if (component == nil)
-        response = [application handlePageRestorationErrorInContext:context];
-#if DEBUG
-      else {
-       [self logWithFormat:@"%s: restored request component: %@", 
-               __PRETTY_FUNCTION__, component];
+      /*
+        only try to restore a page if we still have the same session and if
+        the request contains an element-id (eg if we reconnect to the main
+        URL we do not have an element-id
+      */
+      eid = [context currentElementID];
+      if ([sessionID isEqualToString:[session sessionID]] && eid != nil) {
+       /* awake stored page from "old" session */
+       component = [session restorePageForContextID:eid];
+       
+       if (component == nil) {
+         [self logWithFormat:@"could not restore component from session: %@",
+               session];
+         response = [application handlePageRestorationErrorInContext:context];
+       }
       }
-#endif
+      else /* a new session was created (but no restore-error response ret.) */
+       component = [application pageWithName:nil inContext:context];
     }
     else if (response == nil) {
       [[WOApplication application] warnWithFormat:
                                      @"got no session restoration error, "
-                                     @"but missing session !"];
+                                     @"but missing session!"];
     }
   }
   else {
     if ([context savePageRequired])
       [session savePage:[context page]];
     
-    [self logWithFormat:@"saving session %@", [session sessionID]];
+    [self debugWithFormat:@"saving session %@", [session sessionID]];
     
     if ([session storesIDsInCookies]) {
-      [self logWithFormat:@"add cookie to session: %@", session];
+      [self debugWithFormat:@"add cookie to session: %@", session];
       [self addCookiesForSession:session
            toResponse:response
            inContext:context];
     }
     
-#if 1
+#if 1 // TODO: explain that
     [application saveSessionForContext:context];
 #else
     [self saveSession:session