static char * makeRefreshCheckRequest(StoreEntry * entry, refresh_check_format * format) { static MemBuf mb = MemBufNULL; int first = 1; HttpReply *reply; String sb = StringNull; if (!entry->mem_obj) return NULL; reply = entry->mem_obj->reply; memBufReset(&mb); for (; format; format = format->next) { char buf[256]; const char *str = NULL; const char *quoted; switch (format->type) { case REFRESH_CHECK_URI: str = entry->mem_obj->url; break; case REFRESH_CHECK_AGE: snprintf(buf, sizeof(buf), "%ld", (long int) (squid_curtime - entry->timestamp)); str = buf; break; case REFRESH_CHECK_RESP_HEADER: sb = httpHeaderGetByName(&reply->header, format->header); str = strBuf(sb); break; case REFRESH_CHECK_RESP_HEADER_ID: sb = httpHeaderGetStrOrList(&reply->header, format->header_id); str = strBuf(sb); break; case REFRESH_CHECK_RESP_HEADER_MEMBER: sb = httpHeaderGetByNameListMember(&reply->header, format->header, format->member, format->separator); str = strBuf(sb); break; case REFRESH_CHECK_RESP_HEADER_ID_MEMBER: sb = httpHeaderGetListMember(&reply->header, format->header_id, format->member, format->separator); str = strBuf(sb); break; case REFRESH_CHECK_UNKNOWN: case REFRESH_CHECK_END: fatal("unknown refresh_check_program format error"); break; } if (!str || !*str) str = "-"; if (!first) memBufAppend(&mb, " ", 1); quoted = rfc1738_escape(str); memBufAppend(&mb, quoted, strlen(quoted)); stringClean(&sb); first = 0; } return mb.buf; }
/* * returns a the value of the specified list member, if any. */ String httpHeaderGetListMember(const HttpHeader * hdr, http_hdr_type id, const char *member, const char separator) { String result = StringNull; String header; const char *pos = NULL; const char *item; int ilen; int mlen = strlen(member); assert(hdr); assert_eid(id); header = httpHeaderGetStrOrList(hdr, id); while (strListGetItem(&header, separator, &item, &ilen, &pos)) { if (strncmp(item, member, mlen) == 0 && item[mlen] == '=') { stringAppend(&result, item + mlen + 1, ilen - mlen - 1); break; } } stringClean(&header); return result; }
/* * Returns the value of the specified header. */ String httpHeaderGetByName(const HttpHeader * hdr, const char *name) { http_hdr_type id; HttpHeaderPos pos = HttpHeaderInitPos; HttpHeaderEntry *e; String result = StringNull; assert(hdr); assert(name); /* First try the quick path */ id = httpHeaderIdByNameDef(name, strlen(name)); if (id != -1) return httpHeaderGetStrOrList(hdr, id); /* Sorry, an unknown header name. Do linear search */ while ((e = httpHeaderGetEntry(hdr, &pos))) { if (e->id == HDR_OTHER && strCaseCmp(e->name, name) == 0) { strListAdd(&result, strBuf(e->value), ','); } } return result; }
static char * makeExternalAclKey(aclCheck_t * ch, external_acl_data * acl_data) { static MemBuf mb = MemBufNULL; char buf[256]; int first = 1; wordlist *arg; external_acl_format *format; request_t *request = ch->request; String sb = StringNull; memBufReset(&mb); for (format = acl_data->def->format; format; format = format->next) { const char *str = NULL; switch (format->type) { case EXT_ACL_LOGIN: str = authenticateUserRequestUsername(request->auth_user_request); break; #if USE_IDENT case EXT_ACL_IDENT: str = ch->rfc931; if (!str || !*str) { ch->state[ACL_IDENT] = ACL_LOOKUP_NEEDED; return NULL; } break; #endif case EXT_ACL_SRC: str = inet_ntoa(ch->src_addr); break; case EXT_ACL_DST: str = request->host; break; case EXT_ACL_PROTO: str = ProtocolStr[request->protocol]; break; case EXT_ACL_PORT: snprintf(buf, sizeof(buf), "%d", request->port); str = buf; break; case EXT_ACL_METHOD: str = RequestMethodStr[request->method]; break; case EXT_ACL_HEADER: sb = httpHeaderGetByName(&request->header, format->header); str = strBuf(sb); break; case EXT_ACL_HEADER_ID: sb = httpHeaderGetStrOrList(&request->header, format->header_id); str = strBuf(sb); break; case EXT_ACL_HEADER_MEMBER: sb = httpHeaderGetByNameListMember(&request->header, format->header, format->member, format->separator); str = strBuf(sb); break; case EXT_ACL_HEADER_ID_MEMBER: sb = httpHeaderGetListMember(&request->header, format->header_id, format->member, format->separator); str = strBuf(sb); break; } if (str) if (!*str) str = NULL; if (!str) str = "-"; if (!first) memBufAppend(&mb, " ", 1); strwordquote(&mb, str); stringClean(&sb); first = 0; } for (arg = acl_data->arguments; arg; arg = arg->next) { if (!first) memBufAppend(&mb, " ", 1); strwordquote(&mb, arg->key); first = 0; } return mb.buf; }