]> err.no Git - sope/commitdiff
added support for x-http-method-override header
authorhelge <helge@e4a50df8-12e2-0310-a44c-efbce7f8a7e3>
Sun, 23 Apr 2006 01:37:41 +0000 (01:37 +0000)
committerhelge <helge@e4a50df8-12e2-0310-a44c-efbce7f8a7e3>
Sun, 23 Apr 2006 01:37:41 +0000 (01:37 +0000)
git-svn-id: http://svn.opengroupware.org/SOPE/trunk@1254 e4a50df8-12e2-0310-a44c-efbce7f8a7e3

sope-appserver/NGObjWeb/ChangeLog
sope-appserver/NGObjWeb/SoObjects/SoObjectMethodDispatcher.m
sope-appserver/NGObjWeb/Version

index 20052f364f76ccc7a8d443e7dce88f62dedc15bd..07f98f3c609a10078cd0344f4f24d6c656e1cf33 100644 (file)
@@ -1,5 +1,8 @@
 2006-04-23  Helge Hess  <helge.hess@opengroupware.org>
 
+       * SoObjects/SoObjectMethodDispatcher.m: added support for
+         x-http-method-override header (v4.5.228)
+
        * SoObjects/SoHTTPAuthenticator.m: prepared some Google login API
          support (v4.5.227)
 
index 25bf5032eea87332250b292100e07cf2c2b8dc8f..ccd43e1f76b07688d71da7bbe1931ef5de056ded 100644 (file)
@@ -62,6 +62,7 @@ static BOOL useRedirectsForDefaultMethods = NO;
 - (id)dispatchInContext:(WOContext *)_ctx {
   NSAutoreleasePool *pool;
   WORequest *rq;
+  NSString  *httpMethod;
   id clientObject;
   id methodObject;
   id resultObject;
@@ -92,7 +93,14 @@ static BOOL useRedirectsForDefaultMethods = NO;
   }
   
   // TODO: should check XML-RPC !!! 
-  //       (hm, why ? XML-RPC is handled by other dispatcher ?)
+  //       (hm, why? XML-RPC is handled by other dispatcher?)
+  
+  /* 
+     This X- field is used by Google which uses POST to trigger REST methods,
+     don't ask me why ... ;-/
+  */
+  if (![(httpMethod = [rq headerForKey:@"x-http-method-override"]) isNotEmpty])
+    httpMethod = [rq method];
   
   /* find callable (method) object */
   
@@ -101,7 +109,7 @@ static BOOL useRedirectsForDefaultMethods = NO;
       [self debugWithFormat:@"traversed object is callable: %@", self->object];
     methodObject = self->object;
   }
-  else if ([[self->object soClass] hasKey:[rq method] inContext:_ctx]) {
+  else if ([[self->object soClass] hasKey:httpMethod inContext:_ctx]) {
     // TODO: I'm not sure whether this step is correct
     /* the class has a GET/PUT/xxx method */
     methodObject = [self->object lookupName:[rq method] 
@@ -115,24 +123,22 @@ static BOOL useRedirectsForDefaultMethods = NO;
     NSString *defaultName;
     
     defaultName = [self->object defaultMethodNameInContext:_ctx];
-    if ([defaultName isNotNull]) {
-      if ([defaultName length] > 0) {
-       WOResponse *r;
-       NSString   *url;
+    if ([defaultName isNotEmpty]) {
+      WOResponse *r;
+      NSString   *url;
        
-       url = [self->object baseURLInContext:_ctx];
-       if (![url hasSuffix:@"/"]) url = [url stringByAppendingString:@"/"];
-       url = [url stringByAppendingString:defaultName];
+      url = [self->object baseURLInContext:_ctx];
+      if (![url hasSuffix:@"/"]) url = [url stringByAppendingString:@"/"];
+      url = [url stringByAppendingString:defaultName];
        
-       [self debugWithFormat:@"redirect to default method %@ of %@: %@", 
-               defaultName, self->object, url];
+      [self debugWithFormat:@"redirect to default method %@ of %@: %@", 
+             defaultName, self->object, url];
        
-       r = [[_ctx response] retain];
-       [r setStatus:302 /* moved */];
-       [r setHeader:url forKey:@"location"];
-       [pool release];
-       return [r autorelease];
-      }
+      r = [[_ctx response] retain];
+      [r setStatus:302 /* moved */];
+      [r setHeader:url forKey:@"location"];
+      [pool release];
+      return [r autorelease];
     }
   }
   else {
index 237873aa16b5c717dc9c797320cb6acf3229bc53..ba6f797d8e8d1eb8810974a9321d10d33ae9da7b 100644 (file)
@@ -1,6 +1,6 @@
 # version file
 
-SUBMINOR_VERSION:=227
+SUBMINOR_VERSION:=228
 
 # v4.5.214 requires libNGExtensions v4.5.179
 # v4.5.122 requires libNGExtensions v4.5.153