]> err.no Git - sope/commitdiff
Added an option to ignore hostname checks for WebDAV moves.
authorhelge <helge@e4a50df8-12e2-0310-a44c-efbce7f8a7e3>
Thu, 4 May 2006 01:24:29 +0000 (01:24 +0000)
committerhelge <helge@e4a50df8-12e2-0310-a44c-efbce7f8a7e3>
Thu, 4 May 2006 01:24:29 +0000 (01:24 +0000)
Improved HTTP logging.

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

sope-appserver/NGObjWeb/ChangeLog
sope-appserver/NGObjWeb/Defaults.plist
sope-appserver/NGObjWeb/Version
sope-appserver/NGObjWeb/WOHttpAdaptor/WOHttpTransaction.m
sope-appserver/NGObjWeb/WOHttpAdaptor/WORecordRequestStream.m
sope-appserver/NGObjWeb/WOStatisticsStore.m
sope-appserver/NGObjWeb/WebDAV/SoObjectWebDAVDispatcher.m

index d945385aa02ac70032b90e14252947bc7cfe593c..4a5399fc14afe35f0531a416f766ab32d867cef6 100644 (file)
@@ -1,3 +1,15 @@
+2006-05-04  Helge Hess  <helge.hess@opengroupware.org>
+
+       * v4.5.230
+
+       * WebDAV/SoObjectWebDAVDispatcher.m: added default
+         'SoWebDAVDisableCrossHostMoveCheck' to disable the check for the
+         hostname on WebDAV MOVE/COPY operations. This can give issues when
+         Apache is accessed with different DNS names or IPs.
+
+       * WOHttpAdaptor/WOHttpTransaction.m: log HTTP request size after
+         response size
+
 2006-05-01  Helge Hess  <helge.hess@opengroupware.org>
 
        * v4.5.229
index 7e5f05ccb11aa2f1cc3ea5762d9b6f6c19587d91..7b844c99e8e138475cde5aeb3c0b55ff1f3a7e87 100644 (file)
   );
   SoWebDAVFormatOutput = NO;
   DAVParserDebugProp = NO;
-
+  
+  SoWebDAVDisableCrossHostMoveCheck = NO;
+  
   SoWebDAVDefaultAllowMethods = (
     GET, HEAD, POST, OPTIONS, MKCOL, DELETE, PUT,
     LOCK, UNLOCK, COPY, MOVE
index dc86cd939fbc09afe533d86ee5ffed57467ae167..65af81b9f96276327a52ca246af07cbe3b821fba 100644 (file)
@@ -1,6 +1,6 @@
 # version file
 
-SUBMINOR_VERSION:=229
+SUBMINOR_VERSION:=230
 
 # v4.5.214 requires libNGExtensions v4.5.179
 # v4.5.122 requires libNGExtensions v4.5.153
index f2a1530d478a707ad9ad7f75db82c26c5a254200..dbb44661126fdc5b84ebf9f3417c4204dec11692 100644 (file)
@@ -151,8 +151,7 @@ static NGLogger *transActionLogger = nil;
   if (self->woResponse == nil)
     return;
 
-  [self logResponse:self->woResponse
-             toRequest:self->woRequest
+  [self logResponse:self->woResponse toRequest:self->woRequest
         connection:self->socket];
 
   if (perfLogger) {
@@ -402,7 +401,7 @@ static int logCounter = 0;
                   rt < 0.0 ? -1.0 : rt];
   }
   
-  if (self->woResponse) {
+  if (self->woResponse != nil) {
     [self deliverResponse:self->woResponse
           toRequest:self->woRequest
           onStream:self->io];
@@ -414,7 +413,7 @@ static int logCounter = 0;
                     rt < 0.0 ? -1.0 : rt];
     }
   }
-  else if (self->woRequest) {
+  else if (self->woRequest != nil) {
     [self errorWithFormat:@"got no response for request %@ ..",
             self->woRequest];
       
@@ -720,7 +719,7 @@ static int logCounter = 0;
       rlen = strlen((const char *)r);
       if ((slen + rlen + 8) < 1000) {
         [t1 getCString:(char *)buf];
-        sprintf((char *)&(buf[slen]), " %i %s\r\n", s, r);
+        snprintf((char *)&(buf[slen]), sizeof(buf), " %i %s\r\n", s, r);
         isok = [_out safeWriteBytes:buf count:strlen((char *)buf)];
       }
       else
@@ -735,7 +734,7 @@ static int logCounter = 0;
     
     /* add content length header */
     
-    sprintf((char *)buf, "%d", [body length]);
+    snprintf((char *)buf, sizeof(buf), "%d", [body length]);
     t1 = [[NSString alloc] initWithCString:(char *)buf];
     [_response setHeader:t1 forKey:@"content-length"];
     [t1 release]; t1 = nil;
@@ -879,6 +878,7 @@ static __inline__ const char *monthAbbr(int m) {
     Profiling: this method takes 0.95% of -run if the output is piped to
     /dev/null on OSX, morphing caldate to string is 0.79% of that.
   */
+  static BOOL doExtLog = YES;
   NSString        *remoteHost;
   NSNumber        *zippedLen;
   NSCalendarDate  *now;
@@ -928,11 +928,14 @@ static __inline__ const char *monthAbbr(int m) {
   [buf appendString:@" "];
   [buf appendString:[_request httpVersion]];
   [buf appendString:@"\" "];
-  [buf appendFormat:@"%i",  [_response status]];
-  [buf appendFormat:@" %i", [[_response content] length]];
-
+  [buf appendFormat:@"%i %i",  
+         [_response status],
+         [[_response content] length]];
+  if (doExtLog)
+    [buf appendFormat:@"/%i", [[_request content] length]];
+  
   /* append duration */
-  if (lstartDate)
+  if (lstartDate != nil)
     [buf appendFormat:@" %.3f", [now timeIntervalSinceDate:lstartDate]];
   else
     [buf appendString:@" -"];
index eb466e67489456f92aa4d1f90198958fcd8d6537..db1cb1d29bdc7bd6682e6894baa703318f4fcedb 100644 (file)
@@ -28,7 +28,7 @@
 @implementation WORecordRequestStream
 
 - (id)initWithSource:(id<NGStream>)_source {
-  if ((self = [super initWithSource:_source])) {
+  if ((self = [super initWithSource:_source]) != nil) {
     self->readLog  = [[NSMutableData alloc] initWithCapacity:ReadLogInitSize];
     self->writeLog = [[NSMutableData alloc] initWithCapacity:WriteLogInitSize];
   }
index 58b0d62de45cf1b4face87c5646ce27421db81a1..b91d90790d2499e9bfae15fcf6114507bea10198 100644 (file)
@@ -69,9 +69,9 @@ static BOOL  runMultithreaded = NO;
 
   if (gmt == nil)
     gmt = [[NSTimeZone timeZoneWithAbbreviation:@"GMT"] retain];
-
+  
   runMultithreaded = [[NSUserDefaults standardUserDefaults]
-                      boolForKey:@"WORunMultithreaded"];
+                                     boolForKey:@"WORunMultithreaded"];
 }
 
 - (id)init {
@@ -99,7 +99,7 @@ static id mkuint(unsigned int i) {
   return [NSNumberClass numberWithUnsignedInt:i];
 }
 static id mkdbl(double d) {
-#if 1
+#if 1 // TODO: why is that?
   char buf[64];
   sprintf(buf, "%.3f", d);
   return [NSStringClass stringWithCString:buf];
@@ -138,7 +138,7 @@ static id mkdbl(double d) {
   
   if (pageStats->totalResponseCount > 0) {
     [stats setObject:
-             mkuint(pageStats->totalResponseSize / pageStats->totalResponseCount)
+             mkuint(pageStats->totalResponseSize/pageStats->totalResponseCount)
            forKey:@"averageResponseSize"];
     [stats setObject:
              mkdbl(pageStats->totalDuration / pageStats->totalResponseCount)
index 53f5eb738a992550289682d89f591b355d4586e7..ffb310182530784d1581dcea5772ce6e8f0fbb36 100644 (file)
@@ -49,6 +49,7 @@
 
 static int      debugOn = -1;
 static BOOL     debugBulkTarget = NO;
+static BOOL     disableCrossHostMoveCheck = NO;
 static NSNumber *yesNum = nil;
 
 + (void)initialize {
@@ -60,6 +61,9 @@ static NSNumber *yesNum = nil;
   debugOn = [ud boolForKey:@"SoObjectDAVDispatcherDebugEnabled"] ? 1 : 0;
   if (debugOn) NSLog(@"Note: WebDAV dispatcher debugging is enabled.");
   if (yesNum == nil) yesNum = [[NSNumber numberWithBool:YES] retain];
+  
+  disableCrossHostMoveCheck =
+    [ud boolForKey:@"SoWebDAVDisableCrossHostMoveCheck"];
 }
 
 // THREAD
@@ -696,7 +700,7 @@ static NSTimeZone                *gmt      = nil;
            pathInfo, delProps, setProps];
   }
   
-  if ([pathInfo length] == 0) {
+  if (![pathInfo isNotEmpty]) {
     /* edit an object */
     NSException *e;
     
@@ -847,30 +851,37 @@ static NSTimeZone                *gmt      = nil;
     /* 
        The WebDAV spec is not really clear on what we should return in this
        case? Let me know if anybody has a suggestion ...
+
+       Note: This is easy to confuse if you don't use the Apache server name
+             to access Apache (eg just the IP). Which is why we allow to
+            disable this check.
     */
     [self logWithFormat:@"tried to do a cross server move (%@ vs %@)",
            [srvURL absoluteString], [destURL absoluteString]];
-    return [self httpException:403 /* Forbidden */
-                reason:@"MOVE destination is on a different host."];
+    if (!disableCrossHostMoveCheck) {
+      return [self httpException:403 /* Forbidden */
+                  reason:@"MOVE destination is on a different host."];
+    }
   }
   
-  if (path_) {
+  if (path_ != NULL) {
     NSMutableArray *ma;
     unsigned i;
     
     /* TODO: hack hack hack */
     ma = [[[destURL path] componentsSeparatedByString:@"/"] mutableCopy];
-    if ([ma count] > 0) // leading slash ("")
+    if ([ma isNotEmpty]) // leading slash ("")
       [ma removeObjectAtIndex:0];
-    if ([ma count] > 0) // the appname (eg zidestore)
+    if ([ma isNotEmpty]) // the appname (eg zidestore)
       [ma removeObjectAtIndex:0];
-    if ([ma count] > 0) // the request handler key (eg so)
+    if ([ma isNotEmpty]) // the request handler key (eg so)
       [ma removeObjectAtIndex:0];
     
     /* unescape path components */
     for (i = 0; i < [ma count]; i++) {
-      NSString *s = [ma objectAtIndex:i], *ns;
+      NSString *s, *ns;
       
+      s = [ma objectAtIndex:i];
       ns = [s stringByUnescapingURL];
       if (ns != s)
         [ma replaceObjectAtIndex:i withObject:ns];