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