Merged missing pieces from squid-2.2.STABLE2.rfc2518_methods.patch and squid-2.2.STABLE4.request_entities.patch, and fixed some bugs on the way. Squid-2.3.DEVEL2: Request entities + WebDAV cache consistency * Bug-Fix for requests with request entities when a redirector is being used. * Remove cached objects when update methods are being seen on the object. Index: squid/src/client_side.c diff -u squid/src/client_side.c:1.1.1.43.2.2 squid/src/client_side.c:1.1.1.43.2.3 --- squid/src/client_side.c:1.1.1.43.2.2 Sat Aug 7 19:42:11 1999 +++ squid/src/client_side.c Sat Aug 7 21:42:15 1999 @@ -273,6 +273,7 @@ xmemcpy(new_request->body, old_request->body, old_request->body_sz); new_request->body_sz = old_request->body_sz; } + new_request->content_length = old_request->content_length; requestUnlink(old_request); http->request = requestLink(new_request); } Index: squid/src/enums.h diff -u squid/src/enums.h:1.1.1.35.2.1 squid/src/enums.h:1.1.1.35.2.2 --- squid/src/enums.h:1.1.1.35.2.1 Sat Aug 7 19:42:12 1999 +++ squid/src/enums.h Sat Aug 7 21:42:16 1999 @@ -366,6 +366,7 @@ METHOD_TRACE, /* 110 */ METHOD_PURGE, /* 111 */ METHOD_OPTIONS, + METHOD_DELETE, /* RFC2616 section 9.7 */ #ifndef RFC_2518 METHOD_PROPFIND, METHOD_PROPPATCH, @@ -401,6 +402,7 @@ HTTP_STATUS_NONE = 0, HTTP_CONTINUE = 100, HTTP_SWITCHING_PROTOCOLS = 101, + HTTP_PROCESSING = 102, /* RFC2518 section 10.1 */ HTTP_OK = 200, HTTP_CREATED = 201, HTTP_ACCEPTED = 202, @@ -408,6 +410,7 @@ HTTP_NO_CONTENT = 204, HTTP_RESET_CONTENT = 205, HTTP_PARTIAL_CONTENT = 206, + HTTP_MULTI_STATUS = 207, /* RFC2518 section 10.2 */ HTTP_MULTIPLE_CHOICES = 300, HTTP_MOVED_PERMANENTLY = 301, HTTP_MOVED_TEMPORARILY = 302, @@ -430,12 +433,16 @@ HTTP_REQUEST_ENTITY_TOO_LARGE = 413, HTTP_REQUEST_URI_TOO_LARGE = 414, HTTP_UNSUPPORTED_MEDIA_TYPE = 415, + HTTP_UNPROCESSABLE_ENTITY = 422, /* RFC2518 section 10.3 */ + HTTP_LOCKED = 423, /* RFC2518 section 10.4 */ + HTTP_FAILED_DEPENDENCY = 424, /* RFC2518 section 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 section 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.36.2.1 squid/src/http.c:1.1.1.36.2.3 --- squid/src/http.c:1.1.1.36.2.1 Sat Aug 7 21:13:31 1999 +++ squid/src/http.c Sat Aug 7 21:52:22 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,31 +141,54 @@ case HTTP_MULTIPLE_CHOICES: case HTTP_MOVED_PERMANENTLY: case HTTP_MOVED_TEMPORARILY: - case HTTP_FORBIDDEN: - case HTTP_NOT_FOUND: - case HTTP_METHOD_NOT_ALLOWED: case HTTP_GONE: + case HTTP_NOT_FOUND: remove = 1; break; + case HTTP_FORBIDDEN: + case HTTP_METHOD_NOT_ALLOWED: + forbidden = 1; + break; #if WORK_IN_PROGRESS case HTTP_UNAUTHORIZED: - remove = 1; + forbidden = 1; break; #endif default: - remove = 0; + /* Any 2xx reply should eject previously cached entities... */ + if (status >= 200 && status < 300) + remove = 1; break; } - if (!remove) + if (!remove && !forbidden) return; assert(e->mem_obj); if ((pe = storeGetPublic(e->mem_obj->url, e->mem_obj->method)) != NULL) { assert(e != pe); storeRelease(pe); + } + /* 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 (e->mem_obj->method == METHOD_GET) { - /* A fresh GET should eject old HEAD objects */ - if ((pe = storeGetPublic(e->mem_obj->url, METHOD_HEAD)) != NULL) { + if (forbidden) + return; + /* Remove any cached GET reply when the entity can be expected + * to change as a result of other methods + */ + switch (e->mem_obj->method) { + case METHOD_PUT: + case METHOD_DELETE: +#ifndef RFC_2518 + case METHOD_PROPPATCH: + case METHOD_MKCOL: + case METHOD_MOVE: +#endif + /* Remove any cached GET object if it is beleived that the + * object may have changed as a result of other methods + */ + 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.27 squid/src/url.c:1.1.1.27.2.2 --- squid/src/url.c:1.1.1.27 Sat Aug 7 17:13:33 1999 +++ squid/src/url.c Sat Aug 7 22:03:05 1999 @@ -46,6 +46,7 @@ "TRACE", "PURGE", "OPTIONS", + "DELETE", #ifndef RFC_2518 "PROPFIND", "PROPPATCH", @@ -128,38 +129,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; - } else if (strcasecmp(s, "OPTIONS") == 0) { - return METHOD_OPTIONS; -#ifndef RFC_2518 - } else if (strcasecmp(s, "PROPFIND") == 0) { - return METHOD_PROPFIND; - } else if (strcasecmp(s, "PROPPATCH") == 0) { - return METHOD_PROPPATCH; - } else if (strcasecmp(s, "MKCOL") == 0) { - return METHOD_MKCOL; - } else if (strcasecmp(s, "COPY") == 0) { - return METHOD_COPY; - } else if (strcasecmp(s, "MOVE") == 0) { - return METHOD_MOVE; - } else if (strcasecmp(s, "LOCK") == 0) { - return METHOD_LOCK; - } else if (strcasecmp(s, "UNLOCK") == 0) { - return METHOD_UNLOCK; -#endif + method_t method; + for (method = 1 ; method < METHOD_ENUM_END; method++) { + if (strcasecmp(s, RequestMethodStr[method])==0) + return method; } return METHOD_NONE; }