Squid-2.2.STABLE2: Add new methods defined in RFC2518 This patch adds forwarding capability for the methods defined in RFC2518 (WebDAV). There is however one important bug left to kill before WebDAV may function throught Squid (requests other than PUT/POST containing a requests body are truncated to headers only). Index: squid/src/enums.h diff -u squid/src/enums.h:1.1.1.31.8.3 squid/src/enums.h:1.1.1.31.8.4 --- squid/src/enums.h:1.1.1.31.8.3 Tue May 11 05:13:05 1999 +++ squid/src/enums.h Sat May 15 22:38:17 1999 @@ -366,6 +366,15 @@ METHOD_CONNECT, /* 101 */ METHOD_TRACE, /* 110 */ METHOD_PURGE, /* 111 */ + METHOD_OPTIONS, /* HTTP/1.1 9.2 */ + METHOD_DELETE, /* HTTP/1.1 9.7 */ + METHOD_PROPFIND, /* rfc2518 8.1 */ + METHOD_PROPATCH, /* rfc2518 8.2 */ + METHOD_MKCOL, /* rfc2518 8.3 */ + METHOD_COPY, /* rfc2518 8.8 */ + METHOD_MOVE, /* rfc2518 8.9 */ + METHOD_LOCK, /* rfc2518 8.10 */ + METHOD_UNLOCK, /* rfc2518 8.11 */ METHOD_ENUM_END }; typedef unsigned int method_t; @@ -392,6 +401,7 @@ HTTP_STATUS_NONE = 0, HTTP_CONTINUE = 100, HTTP_SWITCHING_PROTOCOLS = 101, + HTTP_PROCESSING = 102, /* RFC2518 10.1 */ HTTP_OK = 200, HTTP_CREATED = 201, HTTP_ACCEPTED = 202, @@ -399,6 +409,7 @@ HTTP_NO_CONTENT = 204, HTTP_RESET_CONTENT = 205, HTTP_PARTIAL_CONTENT = 206, + HTTP_MULTI_STATUS = 207, /* RFC2518 10.2 */ HTTP_MULTIPLE_CHOICES = 300, HTTP_MOVED_PERMANENTLY = 301, HTTP_MOVED_TEMPORARILY = 302, @@ -421,12 +432,16 @@ HTTP_REQUEST_ENTITY_TOO_LARGE = 413, HTTP_REQUEST_URI_TOO_LARGE = 414, HTTP_UNSUPPORTED_MEDIA_TYPE = 415, + HTTP_UNPROCESSABLE_ENTITY = 433, /* RFC2518 10.3 */ + HTTP_LOCKED = 424, /* RFC2518 10.4 */ + HTTP_FAILED_DEPENDENCY = 424, /* RFC2518 10.5 */ HTTP_INTERNAL_SERVER_ERROR = 500, HTTP_NOT_IMPLEMENTED = 501, HTTP_BAD_GATEWAY = 502, HTTP_SERVICE_UNAVAILABLE = 503, HTTP_GATEWAY_TIMEOUT = 504, HTTP_HTTP_VERSION_NOT_SUPPORTED = 505, + HTTP_INSUFFICIENT_STORAGE = 507, /* RFC2518 10.6 */ HTTP_INVALID_HEADER = 600 /* Squid header parsing error */ } http_status; Index: squid/src/http.c diff -u squid/src/http.c:1.1.1.32.6.2 squid/src/http.c:1.1.1.32.6.3 --- squid/src/http.c:1.1.1.32.6.2 Fri May 14 00:15:56 1999 +++ squid/src/http.c Sat May 15 22:38:17 1999 @@ -131,7 +131,7 @@ static void httpMaybeRemovePublic(StoreEntry * e, http_status status) { - int remove = 0; + int remove = 0, forbidden = 0; StoreEntry *pe; if (!EBIT_TEST(e->flags, KEY_PRIVATE)) return; @@ -141,11 +141,14 @@ case HTTP_MULTIPLE_CHOICES: case HTTP_MOVED_PERMANENTLY: case HTTP_MOVED_TEMPORARILY: + case HTTP_GONE: + remove = 1; + break; case HTTP_FORBIDDEN: case HTTP_NOT_FOUND: case HTTP_METHOD_NOT_ALLOWED: - case HTTP_GONE: remove = 1; + forbidden = 1; break; #if WORK_IN_PROGRESS case HTTP_UNAUTHORIZED: @@ -153,7 +156,11 @@ break; #endif default: - remove = 0; + /* Any 2xx reply should eject previously cached entities... */ + if (status >= 200 && status < 300) + remove = 1; + else + remove = 0; break; } if (!remove) @@ -163,9 +170,17 @@ assert(e != pe); storeRelease(pe); } - if (e->mem_obj->method == METHOD_GET) { - /* A fresh GET should eject old HEAD objects */ - if ((pe = storeGetPublic(e->mem_obj->url, METHOD_HEAD)) != NULL) { + /* Also remove any cached HEAD reply in case the object has changed */ + if ((pe = storeGetPublic(e->mem_obj->url, METHOD_HEAD)) != NULL) { + assert(e != pe); + storeRelease(pe); + } + if (forbidden) + return; + /* Remove the any cached GET reply when the entity can be expected + * to change as a result of other methods */ + if (e->mem_obj->method != METHOD_GET) { + if ((pe = storeGetPublic(e->mem_obj->url, METHOD_GET)) != NULL) { assert(e != pe); storeRelease(pe); } Index: squid/src/url.c diff -u squid/src/url.c:1.1.1.24 squid/src/url.c:1.1.1.24.8.1 --- squid/src/url.c:1.1.1.24 Sun Feb 14 23:30:11 1999 +++ squid/src/url.c Sat May 15 22:38:17 1999 @@ -44,7 +44,16 @@ "HEAD", "CONNECT", "TRACE", - "PURGE" + "PURGE", + "OPTIONS", + "DELETE", + "PROPFIND", + "PROPPATCH", + "MKCOL", + "COPY", + "MOVE", + "LOCK", + "UNLOCK" }; const char *ProtocolStr[] = @@ -117,20 +126,10 @@ method_t urlParseMethod(const char *s) { - if (strcasecmp(s, "GET") == 0) { - return METHOD_GET; - } else if (strcasecmp(s, "POST") == 0) { - return METHOD_POST; - } else if (strcasecmp(s, "PUT") == 0) { - return METHOD_PUT; - } else if (strcasecmp(s, "HEAD") == 0) { - return METHOD_HEAD; - } else if (strcasecmp(s, "CONNECT") == 0) { - return METHOD_CONNECT; - } else if (strcasecmp(s, "TRACE") == 0) { - return METHOD_TRACE; - } else if (strcasecmp(s, "PURGE") == 0) { - return METHOD_PURGE; + method_t method; + for (method = 0 ; method < METHOD_ENUM_END; method++) { + if (strcasecmp(s, RequestMethodStr[method])==0) + return method; } return METHOD_NONE; }