]> err.no Git - sope/commitdiff
fixed a logging handler issue with WORequestHandler
authorhelge <helge@e4a50df8-12e2-0310-a44c-efbce7f8a7e3>
Mon, 11 Jul 2005 15:10:32 +0000 (15:10 +0000)
committerhelge <helge@e4a50df8-12e2-0310-a44c-efbce7f8a7e3>
Mon, 11 Jul 2005 15:10:32 +0000 (15:10 +0000)
improved WOComponentRequestHandler

git-svn-id: http://svn.opengroupware.org/SOPE/trunk@884 e4a50df8-12e2-0310-a44c-efbce7f8a7e3

sope-appserver/NGObjWeb/ChangeLog
sope-appserver/NGObjWeb/OWViewRequestHandler.m
sope-appserver/NGObjWeb/Version
sope-appserver/NGObjWeb/WOApplication.m
sope-appserver/NGObjWeb/WOComponent.m
sope-appserver/NGObjWeb/WOComponentRequestHandler.m
sope-appserver/NGObjWeb/WORequestHandler.m

index 20644610a3bc25add499fc5db587c5bcc3c47c26..a4a03963be0e0da0edd169c16068f1ce1ba49792 100644 (file)
@@ -1,3 +1,13 @@
+2005-07-11  Helge Hess  <helge.hess@opengroupware.org>
+       
+       * v4.5.171
+       
+       * WOComponentRequestHandler.m: stabilized session handling to properly
+         deal with expired sessions and URLs without element-ids
+       
+       * WORequestHandler.m: properly register logger bound to
+         'WODebuggingEnabled' as debugLogger, not as the regular logger
+       
 2005-07-08  Helge Hess  <helge.hess@opengroupware.org>
 
        * SoObjects/SoHTTPAuthenticator.m: deprecated -authRealm, replaced with
index 4a9b394bb3089e9a72f96fe9add58a0f2805cdd5..55ae59aa88effcd04568bc217b59d44f3421b34c 100644 (file)
@@ -259,7 +259,7 @@ static BOOL perflog = NO;
     if (requestComponent == nil) {
       /* could not restore page ... */
       response = [app handlePageRestorationErrorInContext:context];
-      if (response) {
+      if (response != nil) {
         [self logWithFormat:
                 @"returning because of page restoration error ..."];
         return response;
index 105404a0c69727c31e813a1f9357d4469ec0436e..2b5113dcdcd79e5c99a071f84dc5651997b04e86 100644 (file)
@@ -1,6 +1,6 @@
 # version file
 
-SUBMINOR_VERSION:=170
+SUBMINOR_VERSION:=171
 
 # v4.5.122 requires libNGExtensions v4.5.153
 # v4.5.91  requires libNGExtensions v4.5.134
index 3c5b7bd75343c9a8ee5a2a66db9c9be296566d49..62933fc6121af80ddf7e20082f224e1df588086e 100644 (file)
@@ -801,6 +801,8 @@ static NSString *defaultCompRqHandlerClassName = @"WOComponentRequestHandler";
     return [self handleSessionRestorationError];
   }
   
+  // TODO: is it correct to return nil?
+  // TODO: we should return a page saying sorry with a cookie + redirect
   [self errorWithFormat:@"could not restore session for context %@", _ctx];
   return nil;
 }
index a6c86efab0451225a2e033855bee9a119174d11f..97a4370b885c190078b1af68f1e753433601e4e8 100644 (file)
@@ -82,7 +82,7 @@ static BOOL  wakeupPageOnCreation              = NO;
 
   ud = [NSUserDefaults standardUserDefaults];
   lm = [NGLoggerManager defaultLoggerManager];
-
+  
   WOComponentClass    = [WOComponent class];
   NSDateClass         = [NSDate class];
   perfLogger          = [lm loggerForDefaultKey:@"WOProfileElements"];
index 0d8027ef78a1358e381ba240c66c28230c24bd59..22c0756f55aba63d5048b02290eef292a684c8ad 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.
 
   inContext:(WOContext *)_ctx
 {
   WOApplication *app = [WOApplication application];
-  WOResponse *response = nil;
+  WOSession *session;
   
   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];
 }
 
 /*
   
   /* restore or create session */
   if ([sessionID isNotNull]) {
-    response = [self restoreSessionWithID:sessionID inContext:context];
-    session  = response ? nil : [context session];
+    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 {
index a958082d52b570600969baa64d266f147f21bfc1..5f8e383c2fe1e21df7d8ea334bcf7e1e583f8379 100644 (file)
@@ -64,11 +64,11 @@ static NGLogger *perfLogger        = nil;
   didInit = YES;
 
   NSDateClass = [NSDate class];
-
+  
   lm         = [NGLoggerManager defaultLoggerManager];
   logger     = [lm loggerForDefaultKey:@"WODebuggingEnabled"];
   perfLogger = [lm loggerForDefaultKey:@"WOProfileRequestHandler"];
-
+  
   ud                 = [NSUserDefaults standardUserDefaults];
   doNotSetCookiePath = [ud boolForKey:@"WOUseGlobalCookiePath"];
 }
@@ -328,13 +328,11 @@ static NGLogger *perfLogger        = nil;
 
 /* logging */
 
-- (id)logger {
+- (id)debugLogger {
   return logger;
 }
 
-@end /* WORequestHandler */
-
-@implementation WORequestHandler(Cookies)
+/* Cookies */
 
 - (void)addCookiesForSession:(WOSession *)_sn
   toResponse:(WOResponse *)_response
@@ -386,7 +384,8 @@ static NGLogger *perfLogger        = nil;
     [_response addCookie:cookie];
 }
 
-@end /* WORequestHandler(Cookies) */
+@end /* WORequestHandler */
+
 
 @implementation WORequest(DblClickBrowser)