From: wessels <> Date: Sun, 7 Dec 1997 01:58:34 +0000 (+0000) Subject: Moved URN->URL resolution over to "server-side" X-Git-Tag: SQUID_3_0_PRE1~4376 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=cf26e54cae51bf33a064d04d6d1043dee453721d;p=thirdparty%2Fsquid.git Moved URN->URL resolution over to "server-side" Now we always generate an HTML list of the possibilities. IF we get a 'minimum RTT' site, then we'll add a 'Location' reply header and the user-agent should fetch it automatically. --- diff --git a/src/client_side.cc b/src/client_side.cc index c2cbc5bb7b..76e5774219 100644 --- a/src/client_side.cc +++ b/src/client_side.cc @@ -1,6 +1,6 @@ /* - * $Id: client_side.cc,v 1.174 1997/12/06 05:16:53 wessels Exp $ + * $Id: client_side.cc,v 1.175 1997/12/06 18:58:34 wessels Exp $ * * DEBUG: section 33 Client-side Routines * AUTHOR: Duane Wessels @@ -559,7 +559,6 @@ httpRequestFree(void *data) safe_free(http->uri); safe_free(http->log_uri); safe_free(http->al.headers.reply); - wordlistDestroy(&http->urls); if (entry) { http->entry = NULL; storeUnregister(entry, http); @@ -1407,6 +1406,7 @@ parseHttpRequest(ConnStateData * conn, method_t * method_p, int *status, *status = -1; return http; } +debug(0,0)("URI=%s\n", url); debug(12, 5) ("parseHttpRequest: Request is '%s'\n", url); token = strtok(NULL, null_string); @@ -1499,6 +1499,7 @@ parseHttpRequest(ConnStateData * conn, method_t * method_p, int *status, /* URL may be rewritten later, so make extra room */ url_sz = strlen(url) + Config.appendDomainLen + 5; http->uri = xcalloc(url_sz, 1); +debug(0,0)("URI=%s\n", url); strcpy(http->uri, url); http->accel = 0; } @@ -1624,10 +1625,7 @@ clientReadRequest(int fd, void *data) break; } http->request = requestLink(request); - if (request->protocol == PROTO_URN) - urnStart(http); - else - clientAccessCheck(http); + clientAccessCheck(http); /* * break here for NON-GET because most likely there is a * reqeust body following and we don't want to parse it diff --git a/src/protos.h b/src/protos.h index 8532a18214..f1ccf3c708 100644 --- a/src/protos.h +++ b/src/protos.h @@ -348,8 +348,7 @@ extern int protoUnregister(StoreEntry *, request_t *); extern int protoAbortFetch(StoreEntry * entry); extern DEFER protoCheckDeferRead; -extern void urnStart(clientHttpRequest *); -extern UH urnTranslateDone; +extern void urnStart(request_t *, StoreEntry *); extern void redirectStart(clientHttpRequest *, RH *, void *); extern void redirectOpenServers(void); diff --git a/src/structs.h b/src/structs.h index ea9c80ba32..9334e428b4 100644 --- a/src/structs.h +++ b/src/structs.h @@ -511,7 +511,6 @@ struct _clientHttpRequest { request_t *request; /* Parsed URL ... */ char *uri; char *log_uri; - wordlist *urls; struct { char *buf; off_t offset; diff --git a/src/url.cc b/src/url.cc index e2bb2d650c..10f3bf39a2 100644 --- a/src/url.cc +++ b/src/url.cc @@ -1,6 +1,6 @@ /* - * $Id: url.cc,v 1.69 1997/12/06 05:17:04 wessels Exp $ + * $Id: url.cc,v 1.70 1997/12/06 18:58:37 wessels Exp $ * * DEBUG: section 23 URL Parsing * AUTHOR: Duane Wessels @@ -51,6 +51,8 @@ const char *ProtocolStr[] = "gopher", "wais", "cache_object", + "icp", + "urn", "TOTAL" }; @@ -103,6 +105,7 @@ urlInitialize(void) url_acceptable[i] = 0; for (; *good; good++) url_acceptable[(unsigned int) *good] = 1; + assert(sizeof(ProtocolStr) == (PROTO_MAX + 1) * sizeof(char *)); } diff --git a/src/urn.cc b/src/urn.cc index 14b1c9ba70..e010b501f7 100644 --- a/src/urn.cc +++ b/src/urn.cc @@ -32,7 +32,12 @@ static STCB urnHandleReply; static wordlist *urn_parsebuffer(const char *inbuf); static const char *const crlf = "\r\n"; -static char *urnConstructMenu(clientHttpRequest * http); + +typedef struct { + StoreEntry *entry; + StoreEntry *urlres_e; + request_t *request; +} UrnState; wordlist * urnFindMinRtt(wordlist * urls, method_t m, int *rtt_ret) @@ -74,50 +79,70 @@ urnFindMinRtt(wordlist * urls, method_t m, int *rtt_ret) } void -urnStart(clientHttpRequest * http) +urnStart(request_t *r, StoreEntry *e) { LOCAL_ARRAY(char, urlres, 4096); - StoreEntry *e; - request_t *r = http->request; request_t *urlres_r = NULL; const cache_key *k; char *t; + UrnState *urnState; + StoreEntry *urlres_e; debug(50, 1) ("urnStart\n"); - assert(http != NULL); - debug(50, 1) ("urnStart: '%s'\n", http->uri); + debug(50, 1) ("urnStart: '%s'\n", storeUrl(e)); t = strchr(r->urlpath, ':'); if (t == NULL) { ErrorState *err = errorCon(ERR_URN_RESOLVE, HTTP_NOT_FOUND); - err->request = requestLink(http->request); - err->url = http->uri; - err->src_addr = http->conn->peer.sin_addr; - errorAppendEntry(http->entry, err); + err->request = requestLink(r); + err->url = xstrdup(storeUrl(e)); + errorAppendEntry(e, err); return; } *t = '\0'; + urnState = xcalloc(1, sizeof(UrnState)); + urnState->entry = e; + urnState->request = requestLink(r); + cbdataAdd(urnState); snprintf(urlres, 4096, "http://%s/uri-res/N2L?%s", r->urlpath, t+1); k = storeKeyPublic(urlres, METHOD_GET); urlres_r = urlParse(METHOD_GET, urlres); urlres_r->headers = xstrdup("Accept: */*\r\n\r\n"); urlres_r->headers_sz = strlen(urlres_r->headers); - if ((e = storeGet(k)) == NULL) { - e = storeCreateEntry(urlres, urlres, 0, METHOD_GET); - storeClientListAdd(e, http); - protoDispatch(0, e, urlres_r); + if ((urlres_e = storeGet(k)) == NULL) { + urlres_e = storeCreateEntry(urlres, urlres, 0, METHOD_GET); + storeClientListAdd(urlres_e, urnState); + protoDispatch(0, urlres_e, urlres_r); + } else { + storeClientListAdd(urlres_e, urnState); } - http->entry = e; - storeClientCopy(e, 0, 0, 4096, get_free_4k_page(), urnHandleReply, http); + urnState->urlres_e = urlres_e; + storeLockObject(urlres_e); + storeClientCopy(urlres_e, + 0, + 0, + 4096, + get_free_4k_page(), + urnHandleReply, + urnState); } static void urnHandleReply(void *data, char *buf, ssize_t size) { - clientHttpRequest *http = data; - StoreEntry *entry = http->entry; + LOCAL_ARRAY(char, line, 4096); + UrnState *urnState = data; + StoreEntry *e = urnState->entry; + StoreEntry *urlres_e = urnState->urlres_e; char *s = NULL; - wordlist *urls = NULL; + char *hdr; + wordlist *w; + wordlist *urls; + wordlist *min_w; + int l; + String *S; + ErrorState *err; + debug(50, 1) ("urnHandleReply: Called with size=%d.\n", size); - if (entry->store_status == STORE_ABORTED) { + if (urlres_e->store_status == STORE_ABORTED) { put_free_4k_page(buf); return; } @@ -128,42 +153,85 @@ urnHandleReply(void *data, char *buf, ssize_t size) put_free_4k_page(buf); return; } - if (entry->store_status == STORE_PENDING) { - storeClientCopy(entry, - entry->mem_obj->inmem_hi, + if (urlres_e->store_status == STORE_PENDING) { + storeClientCopy(urlres_e, + size, 0, SM_PAGE_SIZE, buf, urnHandleReply, - http); + urnState); return; } /* we know its STORE_OK */ s = mime_headers_end(buf); if (s == NULL) { debug(0, 0) ("urnHandleReply: didn't find end-of-headers for %s\n", - storeUrl(entry)); + storeUrl(e)); return; } - assert(http->entry->mem_obj); - assert(http->entry->mem_obj->reply); - httpParseReplyHeaders(buf, http->entry->mem_obj->reply); + assert(urlres_e->mem_obj->reply); + httpParseReplyHeaders(buf, urlres_e->mem_obj->reply); debug(50, 1) ("mem->reply exists, code=%d.\n", - http->entry->mem_obj->reply->code); - if (http->entry->mem_obj->reply->code != 200) { + urlres_e->mem_obj->reply->code); + if (urlres_e->mem_obj->reply->code != 200) { debug(50, 1) ("urnHandleReply: failed.\n"); - /* XX - return error message */ - urnTranslateDone(http, NULL); + err = errorCon(ERR_URN_RESOLVE, HTTP_NOT_FOUND); + err->request = requestLink(urnState->request); + err->url = xstrdup(storeUrl(e)); + errorAppendEntry(e, err); return; } while (isspace(*s)) s++; urls = urn_parsebuffer(s); - urnTranslateDone(http, urls); + if (urls == NULL) { /* unkown URN error */ + debug(50, 1) ("urnTranslateDone: unknown URN (%s).\n", storeUrl(e)); + err = errorCon(ERR_URN_RESOLVE, HTTP_NOT_FOUND); + err->request = requestLink(urnState->request); + err->url = xstrdup(storeUrl(e)); + errorAppendEntry(e, err); + return; + } + min_w = urnFindMinRtt(urls, urnState->request->method, NULL); + storeBuffer(e); + S = stringCreate(1024); + l = snprintf(line, 4096, + "