Annotation of libwww/Library/src/HTMethod.c, revision 2.7

2.1       frystyk     1: /*                                                                  HTMethod.c
                      2: **     MANAGES REQUEST METHODS
                      3: **
                      4: **     (c) COPYRIGHT MIT 1995.
                      5: **     Please first read the full copyright statement in the file COPYRIGH.
2.7     ! kirschpi    6: **     @(#) $Id: HTMethod.c,v 2.6 1998/05/04 19:37:00 frystyk Exp $
2.1       frystyk     7: **
                      8: **
                      9: ** HISTORY:
                     10: **     6 June 95  HFN  Spawned off from HTAccess. Can be extended to allow
                     11: **                     registration of new methods
2.7     ! kirschpi   12: **      15 Feb 2002 MKP Introduced methods from WebDAV protocol and 
        !            13: **                      Extension Methods. (Manuele.Kirsch_Pinheiro@inrialpes.fr
        !            14: **                      or manuele@inf.ufrgs.br)
        !            15: **
2.1       frystyk    16: */
                     17: 
                     18: /* Library Include files */
2.6       frystyk    19: #include "wwwsys.h"
2.1       frystyk    20: #include "HTUtils.h"
                     21: #include "HTString.h"
                     22: #include "HTMethod.h"                                   /* Implemented here */
                     23: 
                     24: PRIVATE char *method_names[] =
                     25: {
                     26:     "INVALID-METHOD",
                     27:     "GET",
                     28:     "HEAD",
                     29:     "POST",
                     30:     "PUT",
2.5       frystyk    31:     "PATCH",
2.1       frystyk    32:     "DELETE",
2.5       frystyk    33:     "TRACE",
                     34:     "OPTIONS",
2.1       frystyk    35:     "LINK",
                     36:     "UNLINK",
2.7     ! kirschpi   37: #ifdef HT_DAV
        !            38:     "LOCK",                                             /* new methods for */
        !            39:     "UNLOCK",                                           /* webDAV protocol */
        !            40:     "PROPFIND",
        !            41:     "PROPPATCH",
        !            42:     "MKCOL",
        !            43:     "COPY",
        !            44:     "MOVE",
        !            45: #endif /* HT_DAV */
        !            46: 
        !            47: #ifdef HT_EXT                                           /* extension methods */
        !            48:     NULL,                                               /* METHOD_EXT_0 */
        !            49:     NULL,                                               /* METHOD_EXT_1 */
        !            50:     NULL,                                               /* METHOD_EXT_2 */
        !            51:     NULL,                                               /* METHOD_EXT_3 */
        !            52:     NULL,                                               /* METHOD_EXT_4 */
        !            53:     NULL,                                               /* METHOD_EXT_5 */
        !            54:     NULL,                                               /* METHOD_EXT_6 */    
        !            55: #endif /* HT_EXT  */
        !            56: 
2.1       frystyk    57:     NULL
                     58: };
                     59: 
2.7     ! kirschpi   60: 
        !            61: #ifdef HT_EXT
        !            62: /* This array keeps the information about the presence of
        !            63: ** an entity body in each extension method
        !            64: */
        !            65: PRIVATE BOOL HTEXT_EntityMethods [] = {
        !            66:     NO,         /* METHOD_EXT_0 */
        !            67:     NO,         /* METHOD_EXT_1 */
        !            68:     NO,         /* METHOD_EXT_2 */
        !            69:     NO,         /* METHOD_EXT_3 */
        !            70:     NO,         /* METHOD_EXT_4 */
        !            71:     NO,         /* METHOD_EXT_5 */
        !            72:     NO          /* METHOD_EXT_6 */
        !            73: };
        !            74: #endif
        !            75: 
2.1       frystyk    76: /* ------------------------------------------------------------------------- */
                     77: 
2.7     ! kirschpi   78: 
2.1       frystyk    79: /*     Get method enum value
                     80: **     ---------------------
                     81: */
2.3       frystyk    82: PUBLIC HTMethod HTMethod_enum (const char * name)
2.1       frystyk    83: {
                     84:     if (name) {
                     85:        if (!strcasecomp(name, *(method_names+1)))
                     86:            return METHOD_GET;
                     87:        else if (!strcasecomp(name, *(method_names+2)))
                     88:            return METHOD_HEAD;
                     89:        else if (!strcasecomp(name, *(method_names+3)))
                     90:            return METHOD_POST;
                     91:        else if (!strcasecomp(name, *(method_names+4)))
                     92:            return METHOD_PUT;
                     93:        else if (!strcasecomp(name, *(method_names+5)))
2.5       frystyk    94:            return METHOD_PATCH;
                     95:        else if (!strcasecomp(name, *(method_names+6)))
2.1       frystyk    96:            return METHOD_DELETE;
2.5       frystyk    97:        else if (!strcasecomp(name, *(method_names+7)))
                     98:            return METHOD_TRACE;
                     99:        else if (!strcasecomp(name, *(method_names+8)))
                    100:            return METHOD_OPTIONS;
                    101:        else if (!strcasecomp(name, *(method_names+9)))
2.1       frystyk   102:            return METHOD_LINK;
2.5       frystyk   103:        else if (!strcasecomp(name, *(method_names+10)))
2.1       frystyk   104:            return METHOD_UNLINK;
2.7     ! kirschpi  105: #ifdef HT_DAV
        !           106:         else if (!strcasecomp(name, *(method_names+11)))        /* WebDAV lock/unlock */
        !           107:             return METHOD_LOCK;
        !           108:         else if (!strcasecomp(name, *(method_names+12)))
        !           109:             return METHOD_UNLOCK;
        !           110: 
        !           111:         else if (!strcasecomp(name, *(method_names+13)))        /* other WebDAV methods */
        !           112:             return METHOD_PROPFIND;
        !           113:         else if (!strcasecomp(name, *(method_names+14)))
        !           114:             return METHOD_PROPPATCH;    
        !           115:         else if (!strcasecomp(name, *(method_names+15)))
        !           116:             return METHOD_MKCOL;
        !           117:         else if (!strcasecomp(name, *(method_names+16)))
        !           118:             return METHOD_COPY;
        !           119:         else if (!strcasecomp(name, *(method_names+17)))        
        !           120:             return METHOD_MOVE;
        !           121: #endif /* HT_DAV */
        !           122: 
        !           123: #ifdef HT_EXT
        !           124:                       /* if there is no extension method set, return METHOD_INVALID */
        !           125:         else if ( *(method_names+18) && !strcasecomp(name, *(method_names+18)))
        !           126:             return METHOD_EXT_0;                                
        !           127:         else if ( *(method_names+19) && !strcasecomp(name, *(method_names+19)))
        !           128:             return METHOD_EXT_1;
        !           129:         else if ( *(method_names+20) && !strcasecomp(name, *(method_names+20)))
        !           130:             return METHOD_EXT_2;
        !           131:         else if ( *(method_names+21) && !strcasecomp(name, *(method_names+21)))
        !           132:             return METHOD_EXT_3;
        !           133:         else if ( *(method_names+22) && !strcasecomp(name, *(method_names+22)))
        !           134:             return METHOD_EXT_4;
        !           135:         else if ( *(method_names+23) && !strcasecomp(name, *(method_names+23)))
        !           136:             return METHOD_EXT_5;
        !           137:         else if ( *(method_names+24) && !strcasecomp(name, *(method_names+24)))
        !           138:             return METHOD_EXT_6;
        !           139: #endif  
2.1       frystyk   140:     }
                    141:     return METHOD_INVALID;
                    142: }
                    143: 
                    144: 
2.7     ! kirschpi  145: 
2.1       frystyk   146: /*     Get method name
                    147: **     ---------------
                    148: **     Returns pointer to entry in static table in memory
                    149: */
2.3       frystyk   150: PUBLIC const char * HTMethod_name (HTMethod method)
2.1       frystyk   151: {
                    152:     if (method & METHOD_GET)
                    153:        return *(method_names+1);
                    154:     else if (method == METHOD_HEAD)
                    155:        return *(method_names+2);
                    156:     else if (method == METHOD_POST)
                    157:        return *(method_names+3);
                    158:     else if (method == METHOD_PUT)
                    159:        return *(method_names+4);
2.5       frystyk   160:     else if (method == METHOD_PATCH)
                    161:        return *(method_names+5);
2.1       frystyk   162:     else if (method == METHOD_DELETE)
2.5       frystyk   163:        return *(method_names+6);
                    164:     else if (method == METHOD_TRACE)
                    165:        return *(method_names+7);
                    166:     else if (method == METHOD_OPTIONS)
                    167:        return *(method_names+8);
2.1       frystyk   168:     else if (method == METHOD_LINK)
2.5       frystyk   169:        return *(method_names+9);
2.1       frystyk   170:     else if (method == METHOD_UNLINK)
2.5       frystyk   171:        return *(method_names+10);
2.7     ! kirschpi  172:     
        !           173: #ifdef HT_DAV    
        !           174:     else if (method == METHOD_LOCK)                     /* webdav lock/unlock */
        !           175:         return *(method_names+11);                      /* methods (locking)  */
        !           176:     else if (method == METHOD_UNLOCK)
        !           177:         return *(method_names+12);
        !           178:     else if (method == METHOD_PROPFIND)                 /* webdav proppatch/propfind */
        !           179:         return *(method_names+13);                      /* methods (properties)      */
        !           180:     else if (method == METHOD_PROPPATCH)
        !           181:         return *(method_names+14);
        !           182:      else if (method == METHOD_MKCOL)                   /* webdav mkcol method */
        !           183:         return *(method_names+15);                      /* (collencions)       */
        !           184:     else if (method == METHOD_COPY)     
        !           185:         return *(method_names+16);                      /* webdav copy/move    */               
        !           186:     else if (method == METHOD_MOVE)                     /* methods (namespace) */
        !           187:         return *(method_names+17);
        !           188: #endif /* HT_DAV */
        !           189: 
        !           190: #ifdef HT_EXT    
        !           191:     else if (method == METHOD_EXT_0 && (*(method_names+18)))    /* extension methods */
        !           192:         return *(method_names+18);                              /* customizable for the app. */
        !           193:     else if (method == METHOD_EXT_1 && (*(method_names+19)))
        !           194:         return *(method_names+19);
        !           195:     else if (method == METHOD_EXT_2 && (*(method_names+20)))    /* if the method is not set */
        !           196:         return *(method_names+20);                              /* then it will return      */
        !           197:     else if (method == METHOD_EXT_3 && ((*method_names+21)))    /* "INVALID-METHOD"         */
        !           198:         return *(method_names+21);
        !           199:     else if (method == METHOD_EXT_4 && ((*method_names+22)))
        !           200:         return *(method_names+22);
        !           201:     else if (method == METHOD_EXT_5 && ((*method_names+23)))
        !           202:         return *(method_names+23);
        !           203:     else if (method == METHOD_EXT_6 && ((*method_names+24)))
        !           204:         return *(method_names+24);
        !           205: #endif /* HT_EXT */
        !           206:     
2.1       frystyk   207:     else
                    208:        return *method_names;
                    209: }
2.7     ! kirschpi  210: 
        !           211: #if defined(HT_DAV) || defined (HT_EXT)
        !           212: 
        !           213: /* 
        !           214: ** Does the method include an entity body? 
        !           215: */
        !           216: PUBLIC BOOL HTMethod_hasEntity (HTMethod me) {
        !           217:     if (me) {
        !           218:         /* normal HTTP methods */
        !           219:         if (me & (METHOD_PUT | METHOD_POST)) return YES;
        !           220: 
        !           221: #ifdef HT_DAV
        !           222:         /* WebDAV methods */
        !           223:         if (me & (METHOD_LOCK | METHOD_PROPFIND | METHOD_PROPPATCH |
        !           224:             METHOD_COPY | METHOD_MOVE)) return YES;
        !           225: #endif
        !           226: 
        !           227: #ifdef HT_EXT
        !           228:         /* extension methods */
        !           229:         HTTRACE (PROT_TRACE, "HTMethod.... Has this extension method a body?\n");
        !           230:         if (me == METHOD_EXT_0) return HTEXT_EntityMethods[0];
        !           231:         else if (me == METHOD_EXT_1) return HTEXT_EntityMethods[1];
        !           232:         else if (me == METHOD_EXT_2) return HTEXT_EntityMethods[2];
        !           233:         else if (me == METHOD_EXT_3) return HTEXT_EntityMethods[3];
        !           234:         else if (me == METHOD_EXT_4) return HTEXT_EntityMethods[4];
        !           235:         else if (me == METHOD_EXT_5) return HTEXT_EntityMethods[5];
        !           236:         else if (me == METHOD_EXT_6) return HTEXT_EntityMethods[6];
        !           237:         else return (NO);
        !           238: #endif
        !           239:     }
        !           240:     return (NO);
        !           241: }
        !           242: 
        !           243: #endif /* HT_DAV || HT_EXT */
        !           244: 
        !           245: 
        !           246: 
        !           247: #ifdef HT_EXT
        !           248: /*
        !           249: ** Set an extension method: HTMethod structure has 7 methods (METHOD_EXT_0
        !           250: ** to METHOD_EXT_6) that can be set by the application.
        !           251: ** This function set one of this extension methods. 
        !           252: **
        !           253: ** Parameters: 
        !           254: **             HTMethod method - extension method to be set
        !           255: **             const char name - new name for the method
        !           256: ** Return:
        !           257: **         BOOL - YES, if the operation succeed
        !           258: **              - NO, if it failed, for example, if the parameter method is
        !           259: **                                  not a extension method (METHOD_EXT_0 -
        !           260: **                                  METHOD_EXT_6)
        !           261: **
        !           262: */
        !           263: PUBLIC BOOL HTMethod_setExtensionMethod (HTMethod method, const char * name, BOOL hasEntity) {
        !           264:     
        !           265:     if (name && *name) {
        !           266:         if (method == METHOD_EXT_0) { 
        !           267:             StrAllocCopy ((char *)(*(method_names+18)), name);
        !           268:             HTEXT_EntityMethods[0] = hasEntity;
        !           269:         }
        !           270:         else if (method == METHOD_EXT_1) {
        !           271:             StrAllocCopy ((char *)(*(method_names+19)), name);
        !           272:             HTEXT_EntityMethods[1] = hasEntity;
        !           273:         }
        !           274:         else if (method == METHOD_EXT_2) {
        !           275:             StrAllocCopy ((char *)(*(method_names+20)), name);
        !           276:             HTEXT_EntityMethods[2] = hasEntity;
        !           277:         }
        !           278:         else if (method == METHOD_EXT_3) {
        !           279:             StrAllocCopy ((char *)(*(method_names+21)), name);
        !           280:             HTEXT_EntityMethods[3] = hasEntity;
        !           281:         }
        !           282:         else if (method == METHOD_EXT_4) {
        !           283:             StrAllocCopy ((char *)(*(method_names+22)), name);
        !           284:             HTEXT_EntityMethods[4] = hasEntity;
        !           285:         }
        !           286:         else if (method == METHOD_EXT_5) {
        !           287:             StrAllocCopy ((char *)(*(method_names+23)), name);
        !           288:             HTEXT_EntityMethods[5] = hasEntity;
        !           289:         }
        !           290:         else if (method == METHOD_EXT_6) {
        !           291:             StrAllocCopy ((char *)(*(method_names+24)), name);  
        !           292:             HTEXT_EntityMethods[6] = hasEntity;
        !           293:         }
        !           294:         else return NO;
        !           295:         return YES;     
        !           296:     }   
        !           297:     return NO;    
        !           298: }
        !           299: 
        !           300: 
        !           301: /*
        !           302: ** Delete the extension method: this funcion unset the extension method
        !           303: */
        !           304: PUBLIC BOOL HTMethod_deleteExtensionMethod (HTMethod method) {
        !           305:     char *ptr = NULL;   
        !           306: 
        !           307:     if ( (method == METHOD_EXT_0) && (*(method_names+18)) )  {
        !           308:          ptr = (char *) (*(method_names+18));
        !           309:          (*(method_names+18)) = NULL;
        !           310:     }
        !           311:     else if ( (method == METHOD_EXT_1) && (*(method_names+19)) ) {
        !           312:         ptr = (char *) (*(method_names+19));
        !           313:         (*(method_names+19)) = NULL;
        !           314:     }   
        !           315:     else if ( (method == METHOD_EXT_2) && (*(method_names+20)) ) {
        !           316:         ptr = (char *) (*(method_names+20));
        !           317:         (*(method_names+20)) = NULL;
        !           318:     }
        !           319:     else if ( (method == METHOD_EXT_3) && (*(method_names+21)) ) {
        !           320:         ptr = (char *) (*(method_names+21));
        !           321:         (*(method_names+21)) = NULL;
        !           322:     }
        !           323:     else if ( (method == METHOD_EXT_4) && (*(method_names+22)) ) {
        !           324:         ptr = (char *) (*(method_names+22));
        !           325:         (*(method_names+22)) = NULL;    
        !           326:     }
        !           327:     else if ( (method == METHOD_EXT_5) && (*(method_names+23)) ) {
        !           328:         ptr = (char *) (*(method_names+23));
        !           329:         (*(method_names+23)) = NULL;
        !           330:     }
        !           331:     else if ( (method == METHOD_EXT_6) && (*(method_names+24)) ) {
        !           332:         ptr = (char *) (*(method_names+24));
        !           333:         (*(method_names+24)) = NULL;
        !           334:     }
        !           335:     
        !           336:     if (ptr) {
        !           337:         HT_FREE(ptr);
        !           338:         return YES;
        !           339:     }
        !           340: 
        !           341:     return NO;
        !           342: }
        !           343: 
        !           344: #endif /* HT_EXT */
2.1       frystyk   345: 

Webmaster