# Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: kinkie@squid-cache.org-20090205105906-0s7g41nl7q05fn0e # target_branch: http://www.squid-cache.org/bzr/squid3/trunk # testament_sha1: b6d68be4d8974bdc8d4c1fe8db9b12df5d1f4d60 # timestamp: 2009-02-05 12:00:17 +0100 # base_revision_id: squid3@treenet.co.nz-20090205075056-\ # yn16jdajg7w10t1n # # Begin patch === modified file 'src/ACLExtUser.cc' --- src/ACLExtUser.cc 2009-01-21 03:47:47 +0000 +++ src/ACLExtUser.cc 2009-01-29 14:50:26 +0000 @@ -79,7 +79,7 @@ ACLExtUser::match(ACLChecklist *checklist) { if (checklist->request->extacl_user.size()) { - return data->match(checklist->request->extacl_user.buf()); + return data->match(checklist->request->extacl_user.unsafeBuf()); } else { return -1; } === modified file 'src/ACLHTTPHeaderData.cc' --- src/ACLHTTPHeaderData.cc 2009-01-21 03:47:47 +0000 +++ src/ACLHTTPHeaderData.cc 2009-01-30 14:55:22 +0000 @@ -63,18 +63,18 @@ if (hdr == NULL) return false; - debugs(28, 3, "aclHeaderData::match: checking '" << hdrName.buf() << "'"); - - String value = hdrId != HDR_BAD_HDR ? hdr->getStrOrList(hdrId) : hdr->getByName(hdrName.buf()); - - return regex_rule->match(value.buf()); + debugs(28, 3, "aclHeaderData::match: checking '" << hdrName << "'"); + + String value = hdrId != HDR_BAD_HDR ? hdr->getStrOrList(hdrId) : hdr->getByName(hdrName.termedBuf()); + + return regex_rule->match(value.termedBuf()); } wordlist * ACLHTTPHeaderData::dump() { wordlist *W = NULL; - wordlistAdd(&W, hdrName.buf()); + wordlistAdd(&W, hdrName.termedBuf()); wordlist * regex_dump = regex_rule->dump(); wordlistAddWl(&W, regex_dump); wordlistDestroy(®ex_dump); @@ -87,14 +87,14 @@ char* t = strtokFile(); assert (t != NULL); hdrName = t; - hdrId = httpHeaderIdByNameDef(hdrName.buf(), strlen(hdrName.buf())); + hdrId = httpHeaderIdByNameDef(hdrName.rawBuf(), hdrName.size()); regex_rule->parse(); } bool ACLHTTPHeaderData::empty() const { - return (hdrId == HDR_BAD_HDR && !hdrName.buf()) || regex_rule->empty(); + return (hdrId == HDR_BAD_HDR && hdrName.undefined()) || regex_rule->empty(); } ACLData * === modified file 'src/ACLUrlPath.cc' --- src/ACLUrlPath.cc 2009-01-21 03:47:47 +0000 +++ src/ACLUrlPath.cc 2009-01-30 14:55:22 +0000 @@ -47,7 +47,7 @@ int ACLUrlPathStrategy::match (ACLData * &data, ACLChecklist *checklist) { - char *esc_buf = xstrdup(checklist->request->urlpath.buf()); + char *esc_buf = xstrdup(checklist->request->urlpath.termedBuf()); rfc1738_unescape(esc_buf); int result = data->match(esc_buf); safe_free(esc_buf); === modified file 'src/CommonPool.h' --- src/CommonPool.h 2009-01-21 03:47:47 +0000 +++ src/CommonPool.h 2009-01-29 14:50:26 +0000 @@ -59,7 +59,7 @@ void *operator new(size_t); void operator delete (void *); static CommonPool *Factory (unsigned char _class, CompositePoolNode::Pointer&); - char const* theClassTypeLabel() const {return typeLabel.buf();} + char const* theClassTypeLabel() const {return typeLabel.unsafeBuf();} protected: CommonPool(); === modified file 'src/DelayTagged.cc' --- src/DelayTagged.cc 2009-01-21 03:47:47 +0000 +++ src/DelayTagged.cc 2009-01-29 14:50:26 +0000 @@ -77,7 +77,7 @@ DelayTaggedCmp(DelayTaggedBucket::Pointer const &left, DelayTaggedBucket::Pointer const &right) { /* for rate limiting, case insensitive */ - return left->tag.caseCmp(right->tag.buf()); + return left->tag.caseCmp(right->tag.unsafeBuf()); } void @@ -195,7 +195,7 @@ void DelayTaggedBucket::stats (StoreEntry *entry) const { - storeAppendPrintf(entry, " %s:", tag.buf()); + storeAppendPrintf(entry, " %s:", tag.unsafeBuf()); theBucket.stats (entry); } === modified file 'src/DiskIO/AIO/AIODiskFile.cc' --- src/DiskIO/AIO/AIODiskFile.cc 2009-01-21 03:47:47 +0000 +++ src/DiskIO/AIO/AIODiskFile.cc 2009-01-29 14:50:26 +0000 @@ -87,10 +87,10 @@ { /* Simulate async calls */ #ifdef _SQUID_WIN32_ - fd = aio_open(path.buf(), flags); + fd = aio_open(path.unsafeBuf(), flags); #else - fd = file_open(path.buf() , flags); + fd = file_open(path.unsafeBuf() , flags); #endif ioRequestor = callback; @@ -130,7 +130,7 @@ fatal("Aiee! out of aiocb slots! - FIXME and wrap file_read\n"); debugs(79, 1, "WARNING: out of aiocb slots!"); /* fall back to blocking method */ - // file_read(fd, request->buf, request->len, request->offset, callback, data); + // file_read(fd, request->unsafeBuf, request->len, request->offset, callback, data); return; } @@ -167,7 +167,7 @@ fatalf("Aiee! aio_read() returned error (%d) FIXME and wrap file_read !\n", errno); debugs(79, 1, "WARNING: aio_read() returned error: " << xstrerror()); /* fall back to blocking method */ - // file_read(fd, request->buf, request->len, request->offset, callback, data); + // file_read(fd, request->unsafeBuf, request->len, request->offset, callback, data); } } @@ -188,7 +188,7 @@ fatal("Aiee! out of aiocb slots FIXME and wrap file_write !\n"); debugs(79, 1, "WARNING: out of aiocb slots!"); /* fall back to blocking method */ - // file_write(fd, offset, buf, len, callback, data, freefunc); + // file_write(fd, offset, unsafeBuf, len, callback, data, freefunc); return; } @@ -225,7 +225,7 @@ fatalf("Aiee! aio_write() returned error (%d) FIXME and wrap file_write !\n", errno); debugs(79, 1, "WARNING: aio_write() returned error: " << xstrerror()); /* fall back to blocking method */ - // file_write(fd, offset, buf, len, callback, data, freefunc); + // file_write(fd, offset, unsafeBuf, len, callback, data, freefunc); } } === modified file 'src/ESI.cc' --- src/ESI.cc 2009-01-07 11:24:40 +0000 +++ src/ESI.cc 2009-02-04 23:25:42 +0000 @@ -2430,7 +2430,7 @@ */ return 0; - if (strstr (sctusable->content.buf(), "ESI/1.0")) + if (strstr (sctusable->content.unsafeBuf(), "ESI/1.0")) rv = 1; httpHdrScTargetDestroy (sctusable); === modified file 'src/ESIAssign.cc' --- src/ESIAssign.cc 2009-01-21 03:47:47 +0000 +++ src/ESIAssign.cc 2009-02-04 23:25:42 +0000 @@ -89,7 +89,7 @@ variable = NULL; if (unevaluatedVariable.size()) { - varState->feedData(unevaluatedVariable.buf(), unevaluatedVariable.size()); + varState->feedData(unevaluatedVariable.unsafeBuf(), unevaluatedVariable.size()); char const *result = varState->extractChar (); /* Consider activating this, when we want to evaluate variables to a @@ -123,7 +123,7 @@ if (!value) return ESI_PROCESS_COMPLETE; - varState->addVariable (name.buf(), name.size(), value); + varState->addVariable (name.unsafeBuf(), name.size(), value); value = NULL; @@ -194,7 +194,7 @@ ESIVariableExpression::eval (ESIVarState &state, char const *subref, char const *defaultOnEmpty) const { /* XXX: Implement evaluation of the expression */ - ESISegment::ListAppend (state.getOutput(), expression.buf(), expression.size()); + ESISegment::ListAppend (state.getOutput(), expression.unsafeBuf(), expression.size()); } #endif /* USE_SQUID_ESI == 1 */ === modified file 'src/ESICustomParser.cc' --- src/ESICustomParser.cc 2009-01-21 03:47:47 +0000 +++ src/ESICustomParser.cc 2009-02-04 23:25:42 +0000 @@ -109,7 +109,7 @@ } size_t openESITags (0); - char const *currentPos = content.buf(); + char const *currentPos = content.unsafeBuf(); size_t remainingCount = content.size(); char const *tag = NULL; @@ -302,7 +302,7 @@ ESICustomParser::errorString() const { if (error.size()) - return error.buf(); + return error.unsafeBuf(); else return "Parsing error strings not implemented"; } === modified file 'src/ESISegment.cc' --- src/ESISegment.cc 2009-01-21 03:47:47 +0000 +++ src/ESISegment.cc 2009-02-04 23:25:42 +0000 @@ -236,5 +236,5 @@ { String temp; temp.limitInit(buf, len); - debugs(86, 9, "ESISegment::dumpOne: \"" << temp.buf() << "\""); + debugs(86, 9, "ESISegment::dumpOne: \"" << temp.unsafeBuf() << "\""); } === modified file 'src/ESIVarState.cc' --- src/ESIVarState.cc 2009-01-21 03:47:47 +0000 +++ src/ESIVarState.cc 2009-01-31 16:05:18 +0000 @@ -317,7 +317,7 @@ void ESIVarState::removeVariable (String const &name) { - Variable *candidate = static_cast (variables.find (name.buf(), name.size())); + Variable *candidate = static_cast (variables.find (name.rawBuf(), name.size())); if (candidate) { /* XXX: remove me */ @@ -434,7 +434,7 @@ String S = state.header().getListMember (HDR_COOKIE, subref, ';'); if (S.size()) - ESISegment::ListAppend (state.getOutput(), S.buf(), S.size()); + ESISegment::ListAppend (state.getOutput(), S.rawBuf(), S.size()); else if (found_default) ESISegment::ListAppend (state.getOutput(), found_default, strlen (found_default)); } @@ -468,7 +468,7 @@ if (state.header().has(HDR_ACCEPT_LANGUAGE)) { if (!subref) { String S (state.header().getList (HDR_ACCEPT_LANGUAGE)); - ESISegment::ListAppend (state.getOutput(), S.buf(), S.size()); + ESISegment::ListAppend (state.getOutput(), S.rawBuf(), S.size()); } else { if (state.header().hasListMember (HDR_ACCEPT_LANGUAGE, subref, ',')) { s = "true"; @@ -884,7 +884,7 @@ String strVary (rep->header.getList (HDR_VARY)); - if (!strVary.size() || strVary.buf()[0] != '*') { + if (!strVary.size() || strVary[0] != '*') { rep->header.putStr (HDR_VARY, tempstr); } } === modified file 'src/HttpHdrCc.cc' --- src/HttpHdrCc.cc 2009-01-21 03:47:47 +0000 +++ src/HttpHdrCc.cc 2009-01-31 17:04:05 +0000 @@ -134,13 +134,13 @@ CcFieldsInfo, CC_ENUM_END); if (type < 0) { - debugs(65, 2, "hdr cc: unknown cache-directive: near '" << item << "' in '" << str->buf() << "'"); + debugs(65, 2, "hdr cc: unknown cache-directive: near '" << item << "' in '" << str << "'"); type = CC_OTHER; } if (EBIT_TEST(cc->mask, type)) { if (type != CC_OTHER) - debugs(65, 2, "hdr cc: ignoring duplicate cache-directive: near '" << item << "' in '" << str->buf() << "'"); + debugs(65, 2, "hdr cc: ignoring duplicate cache-directive: near '" << item << "' in '" << str << "'"); CcFieldsInfo[type].stat.repCount++; @@ -205,7 +205,7 @@ { assert(cc); - if (cc->other.buf()) + if (cc->other.defined()) cc->other.clean(); memFree(cc, MEM_HTTP_HDR_CC); @@ -235,7 +235,9 @@ if (EBIT_TEST(cc->mask, flag) && flag != CC_OTHER) { /* print option name */ - packerPrintf(p, (pcount ? ", %s" : "%s"), CcFieldsInfo[flag].name.buf()); + packerPrintf(p, (pcount ? ", %.*s" : "%.*s"), + CcFieldsInfo[flag].name.size(), + CcFieldsInfo[flag].name.rawBuf()); /* handle options with values */ @@ -253,7 +255,8 @@ } if (cc->other.size()) - packerPrintf(p, (pcount ? ", %s" : "%s"), cc->other.buf()); + packerPrintf(p, (pcount ? ", %.*s" : "%.*s"), + cc->other.size(), cc->other.rawBuf()); } /* negative max_age will clean old max_Age setting */ @@ -299,7 +302,7 @@ extern const HttpHeaderStat *dump_stat; /* argh! */ const int id = (int) val; const int valid_id = id >= 0 && id < CC_ENUM_END; - const char *name = valid_id ? CcFieldsInfo[id].name.buf() : "INVALID"; + const char *name = valid_id ? CcFieldsInfo[id].name.termedBuf() : "INVALID"; if (count || valid_id) storeAppendPrintf(sentry, "%2d\t %-20s\t %5d\t %6.2f\n", === modified file 'src/HttpHdrExtField.cc' --- src/HttpHdrExtField.cc 2009-01-21 03:47:47 +0000 +++ src/HttpHdrExtField.cc 2009-01-31 17:23:17 +0000 @@ -96,6 +96,6 @@ { assert(f); return httpHdrExtFieldDoCreate( - f->name.buf(), f->name.size(), - f->value.buf(), f->value.size()); + f->name.rawBuf(), f->name.size(), + f->value.rawBuf(), f->value.size()); } === modified file 'src/HttpHdrRange.cc' --- src/HttpHdrRange.cc 2009-01-21 03:47:47 +0000 +++ src/HttpHdrRange.cc 2009-01-31 17:23:17 +0000 @@ -251,14 +251,14 @@ int count = 0; assert(this && range_spec); ++ParsedCount; - debugs(64, 8, "parsing range field: '" << range_spec->buf() << "'"); + debugs(64, 8, "parsing range field: '" << range_spec << "'"); /* check range type */ if (range_spec->caseCmp("bytes=", 6)) return 0; /* skip "bytes="; hack! */ - pos = range_spec->buf() + 6; + pos = range_spec->termedBuf() + 6; /* iterate through comma separated list */ while (strListGetItem(range_spec, ',', &item, &ilen, &pos)) { === modified file 'src/HttpHdrSc.cc' --- src/HttpHdrSc.cc 2009-01-21 03:47:47 +0000 +++ src/HttpHdrSc.cc 2009-01-31 17:23:17 +0000 @@ -138,7 +138,7 @@ ScFieldsInfo, SC_ENUM_END); if (type < 0) { - debugs(90, 2, "hdr sc: unknown control-directive: near '" << item << "' in '" << str->buf() << "'"); + debugs(90, 2, "hdr sc: unknown control-directive: near '" << item << "' in '" << str << "'"); type = SC_OTHER; } @@ -162,7 +162,7 @@ if (EBIT_TEST(sct->mask, type)) { if (type != SC_OTHER) - debugs(90, 2, "hdr sc: ignoring duplicate control-directive: near '" << item << "' in '" << str->buf() << "'"); + debugs(90, 2, "hdr sc: ignoring duplicate control-directive: near '" << item << "' in '" << str << "'"); ScFieldsInfo[type].stat.repCount++; @@ -257,7 +257,9 @@ if (EBIT_TEST(sc->mask, flag) && flag != SC_OTHER) { /* print option name */ - packerPrintf(p, (pcount ? ", %s" : "%s"), ScFieldsInfo[flag].name.buf()); + packerPrintf(p, (pcount ? ", %.*s" : "%.*s"), + ScFieldsInfo[flag].name.size(), + ScFieldsInfo[flag].name.rawBuf()); /* handle options with values */ @@ -265,14 +267,14 @@ packerPrintf(p, "=%d", (int) sc->max_age); if (flag == SC_CONTENT) - packerPrintf(p, "=\"%s\"", sc->content.buf()); + packerPrintf(p, "=\"%.*s\"", sc->content.size(), sc->content.rawBuf()); pcount++; } } if (sc->target.size()) - packerPrintf (p, ";%s", sc->target.buf()); + packerPrintf (p, ";%.*s", sc->target.size(), sc->target.rawBuf()); } void @@ -339,7 +341,7 @@ extern const HttpHeaderStat *dump_stat; /* argh! */ const int id = (int) val; const int valid_id = id >= 0 && id < SC_ENUM_END; - const char *name = valid_id ? ScFieldsInfo[id].name.buf() : "INVALID"; + const char *name = valid_id ? ScFieldsInfo[id].name.termedBuf() : "INVALID"; if (count || valid_id) storeAppendPrintf(sentry, "%2d\t %-20s\t %5d\t %6.2f\n", @@ -352,7 +354,7 @@ extern const HttpHeaderStat *dump_stat; /* argh! */ const int id = (int) val; const int valid_id = id >= 0 && id < SC_ENUM_END; - const char *name = valid_id ? ScFieldsInfo[id].name.buf() : "INVALID"; + const char *name = valid_id ? ScFieldsInfo[id].name.termedBuf() : "INVALID"; if (count || valid_id) storeAppendPrintf(sentry, "%2d\t %-20s\t %5d\t %6.2f\n", @@ -369,9 +371,9 @@ while (node) { HttpHdrScTarget *sct = (HttpHdrScTarget *)node->data; - if (target && sct->target.buf() && !strcmp (target, sct->target.buf())) + if (target && sct->target.defined() && !strcmp (target, sct->target.termedBuf())) return sct; - else if (!target && !sct->target.buf()) + else if (!target && sct->target.undefined()) return sct; node = node->next; === modified file 'src/HttpHdrScTarget.cc' --- src/HttpHdrScTarget.cc 2009-01-21 03:47:47 +0000 +++ src/HttpHdrScTarget.cc 2009-01-31 18:23:44 +0000 @@ -68,7 +68,7 @@ { HttpHdrScTarget *dup; assert(sc); - dup = httpHdrScTargetCreate(sc->target.buf()); + dup = httpHdrScTargetCreate(sc->target.termedBuf()); dup->mask = sc->mask; dup->max_age = sc->max_age; dup->content = sc->content; === modified file 'src/HttpHeader.cc' --- src/HttpHeader.cc 2009-01-21 03:47:47 +0000 +++ src/HttpHeader.cc 2009-01-31 18:23:44 +0000 @@ -461,7 +461,7 @@ if (e->id != HDR_OTHER) delById(e->id); else - delByName(e->name.buf()); + delByName(e->name.termedBuf()); } pos = HttpHeaderInitPos; @@ -578,7 +578,8 @@ } if (e->id == HDR_CONTENT_LENGTH && (e2 = findEntry(e->id)) != NULL) { - if (e->value.cmp(e2->value.buf()) != 0) { +// if (e->value.cmp(e2->value.termedBuf()) != 0) { + if (e->value != e2->value) { int64_t l1, l2; debugs(55, Config.onoff.relaxed_header_parser <= 0 ? 1 : 2, "WARNING: found two conflicting content-length headers in {" << getStringPrefix(header_start, header_end) << "}"); @@ -588,12 +589,12 @@ goto reset; } - if (!httpHeaderParseOffset(e->value.buf(), &l1)) { - debugs(55, 1, "WARNING: Unparseable content-length '" << e->value.buf() << "'"); + if (!httpHeaderParseOffset(e->value.termedBuf(), &l1)) { + debugs(55, 1, "WARNING: Unparseable content-length '" << e->value << "'"); delete e; continue; - } else if (!httpHeaderParseOffset(e2->value.buf(), &l2)) { - debugs(55, 1, "WARNING: Unparseable content-length '" << e2->value.buf() << "'"); + } else if (!httpHeaderParseOffset(e2->value.termedBuf(), &l2)) { + debugs(55, 1, "WARNING: Unparseable content-length '" << e2->value << "'"); delById(e2->id); } else if (l1 > l2) { delById(e2->id); @@ -615,7 +616,7 @@ } } - if (e->id == HDR_OTHER && stringHasWhitespace(e->name.buf())) { + if (e->id == HDR_OTHER && stringHasWhitespace(e->name.termedBuf())) { debugs(55, Config.onoff.relaxed_header_parser <= 0 ? 1 : 2, "WARNING: found whitespace in HTTP header name {" << getStringPrefix(field_start, field_end) << "}"); @@ -875,7 +876,7 @@ while ((e = getEntry(&pos))) { if (e->id == id) - strListAdd(s, e->value.buf(), ','); + strListAdd(s, e->value.termedBuf(), ','); } /* @@ -909,7 +910,7 @@ while ((e = getEntry(&pos))) { if (e->id == id) - strListAdd(&s, e->value.buf(), ','); + strListAdd(&s, e->value.termedBuf(), ','); } /* @@ -964,7 +965,7 @@ /* Sorry, an unknown header name. Do linear search */ while ((e = getEntry(&pos))) { if (e->id == HDR_OTHER && e->name.caseCmp(name) == 0) { - strListAdd(&result, e->value.buf(), ','); + strListAdd(&result, e->value.termedBuf(), ','); } } @@ -1209,7 +1210,7 @@ assert(Headers[id].type == ftDate_1123); /* must be of an appropriate type */ if ((e = findEntry(id))) { - value = parse_rfc1123(e->value.buf()); + value = parse_rfc1123(e->value.termedBuf()); httpHeaderNoteParsedEntry(e->id, e->value, value < 0); } @@ -1226,7 +1227,7 @@ if ((e = findEntry(id))) { httpHeaderNoteParsedEntry(e->id, e->value, 0); /* no errors are possible */ - return e->value.buf(); + return e->value.termedBuf(); } return NULL; @@ -1242,7 +1243,7 @@ if ((e = findLastEntry(id))) { httpHeaderNoteParsedEntry(e->id, e->value, 0); /* no errors are possible */ - return e->value.buf(); + return e->value.termedBuf(); } return NULL; @@ -1322,7 +1323,7 @@ HttpHeaderEntry *e; if ((e = findEntry(HDR_CONTENT_RANGE))) { - cr = httpHdrContRangeParseCreate(e->value.buf()); + cr = httpHdrContRangeParseCreate(e->value.termedBuf()); httpHeaderNoteParsedEntry(e->id, e->value, !cr); } @@ -1367,7 +1368,7 @@ assert(Headers[id].type == ftETag); /* must be of an appropriate type */ if ((e = findEntry(id))) - etagParseInit(&etag, e->value.buf()); + etagParseInit(&etag, e->value.termedBuf()); return etag; } @@ -1381,7 +1382,7 @@ memset(&tot, 0, sizeof(tot)); if ((e = findEntry(id))) { - const char *str = e->value.buf(); + const char *str = e->value.termedBuf(); /* try as an ETag */ if (etagParseInit(&tot.tag, str)) { @@ -1417,13 +1418,13 @@ Headers[id].stat.aliveCount++; - debugs(55, 9, "created HttpHeaderEntry " << this << ": '" << name.buf() << " : " << value.buf()); + debugs(55, 9, "created HttpHeaderEntry " << this << ": '" << name << " : " << value ); } HttpHeaderEntry::~HttpHeaderEntry() { assert_eid(id); - debugs(55, 9, "destroying entry " << this << ": '" << name.buf() << ": " << value.buf() << "'"); + debugs(55, 9, "destroying entry " << this << ": '" << name << ": " << value << "'"); /* clean name if needed */ if (id == HDR_OTHER) @@ -1503,7 +1504,7 @@ if (field_end - value_start > 65534) { /* String must be LESS THAN 64K and it adds a terminating NULL */ - debugs(55, 1, "WARNING: ignoring '" << name.buf() << "' header of " << (field_end - value_start) << " bytes"); + debugs(55, 1, "WARNING: ignoring '" << name << "' header of " << (field_end - value_start) << " bytes"); if (id == HDR_OTHER) name.clean(); @@ -1518,24 +1519,24 @@ Headers[id].stat.aliveCount++; - debugs(55, 9, "parsed HttpHeaderEntry: '" << name.buf() << ": " << value.buf() << "'"); + debugs(55, 9, "parsed HttpHeaderEntry: '" << name << ": " << value << "'"); - return new HttpHeaderEntry(id, name.buf(), value.buf()); + return new HttpHeaderEntry(id, name.termedBuf(), value.termedBuf()); } HttpHeaderEntry * HttpHeaderEntry::clone() const { - return new HttpHeaderEntry(id, name.buf(), value.buf()); + return new HttpHeaderEntry(id, name.termedBuf(), value.termedBuf()); } void HttpHeaderEntry::packInto(Packer * p) const { assert(p); - packerAppend(p, name.buf(), name.size()); + packerAppend(p, name.rawBuf(), name.size()); packerAppend(p, ": ", 2); - packerAppend(p, value.buf(), value.size()); + packerAppend(p, value.rawBuf(), value.size()); packerAppend(p, "\r\n", 2); } @@ -1545,7 +1546,7 @@ assert_eid (id); assert (Headers[id].type == ftInt); int val = -1; - int ok = httpHeaderParseInt(value.buf(), &val); + int ok = httpHeaderParseInt(value.termedBuf(), &val); httpHeaderNoteParsedEntry(id, value, !ok); /* XXX: Should we check ok - ie * return ok ? -1 : value; @@ -1559,7 +1560,7 @@ assert_eid (id); assert (Headers[id].type == ftInt64); int64_t val = -1; - int ok = httpHeaderParseOffset(value.buf(), &val); + int ok = httpHeaderParseOffset(value.termedBuf(), &val); httpHeaderNoteParsedEntry(id, value, !ok); /* XXX: Should we check ok - ie * return ok ? -1 : value; @@ -1574,7 +1575,7 @@ if (error) { Headers[id].stat.errCount++; - debugs(55, 2, "cannot parse hdr field: '" << Headers[id].name.buf() << ": " << context.buf() << "'"); + debugs(55, 2, "cannot parse hdr field: '" << Headers[id].name << ": " << context << "'"); } } @@ -1591,7 +1592,7 @@ { const int id = (int) val; const int valid_id = id >= 0 && id < HDR_ENUM_END; - const char *name = valid_id ? Headers[id].name.buf() : "INVALID"; + const char *name = valid_id ? Headers[id].name.termedBuf() : "INVALID"; int visible = count > 0; /* for entries with zero count, list only those that belong to current type of message */ @@ -1669,7 +1670,7 @@ for (ht = (http_hdr_type)0; ht < HDR_ENUM_END; ++ht) { HttpHeaderFieldInfo *f = Headers + ht; storeAppendPrintf(e, "%2d\t %-25s\t %5d\t %6.3f\t %6.3f\n", - f->id, f->name.buf(), f->stat.aliveCount, + f->id, f->name.termedBuf(), f->stat.aliveCount, xpercent(f->stat.errCount, f->stat.parsCount), xpercent(f->stat.repCount, f->stat.seenCount)); } @@ -1690,7 +1691,7 @@ if (name_len >= 0 && name_len != info[i].name.size()) continue; - if (!strncasecmp(name, info[i].name.buf(), + if (!strncasecmp(name, info[i].name.termedBuf(), name_len < 0 ? info[i].name.size() + 1 : name_len)) return info[i].id; } @@ -1715,7 +1716,7 @@ assert(id >= 0 && id < HDR_ENUM_END); - return Headers[id].name.buf(); + return Headers[id].name.termedBuf(); } int @@ -1804,7 +1805,7 @@ int headers_deleted = 0; while ((e = getEntry(&pos))) { - if (strListIsMember(&strConnection, e->name.buf(), ',')) + if (strListIsMember(&strConnection, e->name.termedBuf(), ',')) delAt(pos, headers_deleted); } if (headers_deleted) === modified file 'src/HttpHeaderTools.cc' --- src/HttpHeaderTools.cc 2009-02-04 09:52:20 +0000 +++ src/HttpHeaderTools.cc 2009-02-04 13:48:24 +0000 @@ -258,7 +258,7 @@ delim[2][1] = del; if (!*pos) { - *pos = str->buf(); + *pos = str->termedBuf(); if (!*pos) return 0; === modified file 'src/HttpReply.cc' --- src/HttpReply.cc 2009-02-04 09:52:20 +0000 +++ src/HttpReply.cc 2009-02-04 13:48:24 +0000 @@ -281,7 +281,7 @@ two = otherRep->header.getStrOrList(HDR_ETAG); - if (!one.buf() || !two.buf() || strcasecmp (one.buf(), two.buf())) { + if (one.undefined() || two.undefined() || one.caseCmp(two)!=0 ) { one.clean(); two.clean(); return 0; @@ -295,7 +295,7 @@ two = otherRep->header.getStrOrList(HDR_CONTENT_MD5); - if (!one.buf() || !two.buf() || strcasecmp (one.buf(), two.buf())) { + if (one.undefined() || two.undefined() || one.caseCmp(two) != 0 ) { one.clean(); two.clean(); return 0; @@ -440,7 +440,7 @@ bool HttpReply::sanityCheckStartLine(MemBuf *buf, http_status *error) { if (buf->contentSize() >= protoPrefix.size() && protoPrefix.cmp(buf->content(), protoPrefix.size()) != 0) { - debugs(58, 3, "HttpReply::sanityCheckStartLine: missing protocol prefix (" << protoPrefix.buf() << ") in '" << buf->content() << "'"); + debugs(58, 3, "HttpReply::sanityCheckStartLine: missing protocol prefix (" << protoPrefix << ") in '" << buf->content() << "'"); *error = HTTP_INVALID_HEADER; return false; } === modified file 'src/HttpRequest.cc' --- src/HttpRequest.cc 2009-01-21 03:47:47 +0000 +++ src/HttpRequest.cc 2009-02-03 17:36:15 +0000 @@ -150,7 +150,7 @@ HttpRequest * HttpRequest::clone() const { - HttpRequest *copy = new HttpRequest(method, protocol, urlpath.buf()); + HttpRequest *copy = new HttpRequest(method, protocol, urlpath.termedBuf()); // TODO: move common cloning clone to Msg::copyTo() or copy ctor copy->header.append(&header); copy->hdrCacheInit(); @@ -298,8 +298,8 @@ { assert(p); /* pack request-line */ - packerPrintf(p, "%s %s HTTP/1.0\r\n", - RequestMethodStr(method), urlpath.buf()); + packerPrintf(p, "%s %.*s HTTP/1.0\r\n", + RequestMethodStr(method), urlpath.size(), urlpath.rawBuf()); /* headers */ header.packInto(p); /* trailer */ @@ -336,7 +336,7 @@ assert(e); /* check connection header */ - if (strConn && strListIsMember(strConn, e->name.buf(), ',')) + if (strConn && strListIsMember(strConn, e->name.termedBuf(), ',')) return 0; return 1; @@ -411,7 +411,7 @@ return urlCanonical((HttpRequest*)this); if (urlpath.size()) - return urlpath.buf(); + return urlpath.termedBuf(); return "/"; } === modified file 'src/HttpRequestMethod.cc' --- src/HttpRequestMethod.cc 2009-01-21 03:47:47 +0000 +++ src/HttpRequestMethod.cc 2009-02-03 17:36:15 +0000 @@ -177,7 +177,7 @@ return RequestMethodStr[theMethod]; } else { if (theImage.size()>0) { - return theImage.buf(); + return theImage.termedBuf(); } else { return "METHOD_OTHER"; } === modified file 'src/ICAP/ICAPModXact.cc' --- src/ICAP/ICAPModXact.cc 2008-12-12 00:17:10 +0000 +++ src/ICAP/ICAPModXact.cc 2009-01-31 16:05:18 +0000 @@ -1029,8 +1029,8 @@ * XXX These should use HttpHdr interfaces instead of Printfs */ const Adaptation::ServiceConfig &s = service().cfg(); - buf.Printf("%s %s ICAP/1.0\r\n", s.methodStr(), s.uri.buf()); - buf.Printf("Host: %s:%d\r\n", s.host.buf(), s.port); + buf.Printf("%s %.*s ICAP/1.0\r\n", s.methodStr(), s.uri.size(), s.uri.rawBuf()); + buf.Printf("Host: %.*s:%d\r\n", s.host.size(), s.host.rawBuf(), s.port); buf.Printf("Date: %s\r\n", mkrfc1123(squid_curtime)); if (!TheICAPConfig.reuse_connections) @@ -1038,13 +1038,17 @@ // we must forward "Proxy-Authenticate" and "Proxy-Authorization" // as ICAP headers. - if (virgin.header->header.has(HDR_PROXY_AUTHENTICATE)) - buf.Printf("Proxy-Authenticate: %s\r\n", - virgin.header->header.getByName("Proxy-Authenticate").buf()); + if (virgin.header->header.has(HDR_PROXY_AUTHENTICATE)) { + String vh=virgin.header->header.getByName("Proxy-Authenticate"); + buf.Printf("Proxy-Authenticate: %.*s\r\n", + vh.size(), vh.rawBuf()); + } - if (virgin.header->header.has(HDR_PROXY_AUTHORIZATION)) - buf.Printf("Proxy-Authorization: %s\r\n", - virgin.header->header.getByName("Proxy-Authorization").buf()); + if (virgin.header->header.has(HDR_PROXY_AUTHORIZATION)) { + String vh=virgin.header->header.getByName("Proxy-Authorization"); + buf.Printf("Proxy-Authorization: %.*s\r\n", + vh.size(), vh.rawBuf()); + } buf.Printf("Encapsulated: "); @@ -1107,7 +1111,7 @@ if (TheICAPConfig.send_client_username && request) makeUsernameHeader(request, buf); - // fprintf(stderr, "%s\n", buf.content()); + // fprintf(stderr, "%s\n", unsafeBuf.content()); buf.append(ICAP::crlf, 2); // terminate ICAP header @@ -1268,7 +1272,7 @@ Must(!preview.ad()); // do not add last-chunk because our Encapsulated header says null-body - // addLastRequestChunk(buf); + // addLastRequestChunk(unsafeBuf); preview.wrote(0, true); Must(preview.done()); === modified file 'src/ICAP/ICAPOptXact.cc' --- src/ICAP/ICAPOptXact.cc 2008-10-10 08:02:53 +0000 +++ src/ICAP/ICAPOptXact.cc 2009-01-30 14:55:22 +0000 @@ -43,8 +43,10 @@ void ICAPOptXact::makeRequest(MemBuf &buf) { const Adaptation::Service &s = service(); - buf.Printf("OPTIONS %s ICAP/1.0\r\n", s.cfg().uri.buf()); - buf.Printf("Host: %s:%d\r\n", s.cfg().host.buf(), s.cfg().port); + const String uri = s.cfg().uri; + buf.Printf("OPTIONS %.*s ICAP/1.0\r\n", uri.size(), uri.rawBuf()); + const String host = s.cfg().host; + buf.Printf("Host: %.*s:%d\r\n", host.size(), host.rawBuf(), s.cfg().port); buf.append(ICAP::crlf, 2); } === modified file 'src/ICAP/ICAPOptions.cc' --- src/ICAP/ICAPOptions.cc 2008-12-12 00:17:10 +0000 +++ src/ICAP/ICAPOptions.cc 2009-01-30 14:55:22 +0000 @@ -124,8 +124,8 @@ { const String s = h->getByName(fname); - if (s.size() && xisdigit(*s.buf())) - value = atoi(s.buf()); + if (s.size() && xisdigit(*s.termedBuf())) + value = atoi(s.termedBuf()); else value = -1; @@ -176,8 +176,8 @@ if (eLen < urlLen) { const int eOff = urlLen - eLen; // RFC 3507 examples imply that extensions come without leading '.' - if (urlPath.buf()[eOff-1] == '.' && - strcmp(urlPath.buf() + eOff, e->key) == 0) { + if (urlPath[eOff-1] == '.' && + strcmp(urlPath.termedBuf() + eOff, e->key) == 0) { debugs(93,7, "ICAPOptions url " << urlPath << " matches " << name << " extension " << e->key); return true; === modified file 'src/ICAP/ICAPServiceRep.cc' --- src/ICAP/ICAPServiceRep.cc 2008-12-12 00:17:10 +0000 +++ src/ICAP/ICAPServiceRep.cc 2009-01-30 14:55:22 +0000 @@ -279,8 +279,8 @@ if (!method_found) { debugs(93,1, "WARNING: Squid is configured to use ICAP method " << cfg().methodStr() << - " for service " << cfg().uri.buf() << - " but OPTIONS response declares the methods are " << method_list.buf()); + " for service " << cfg().uri.unsafeBuf() << + " but OPTIONS response declares the methods are " << method_list); } } @@ -293,7 +293,7 @@ // TODO: If skew is negative, the option will be considered down // because of stale options. We should probably change this. debugs(93, 1, "ICAP service's clock is skewed by " << skew << - " seconds: " << cfg().uri.buf()); + " seconds: " << cfg().uri.unsafeBuf()); } } === modified file 'src/ICAP/ICAPXaction.cc' --- src/ICAP/ICAPXaction.cc 2009-01-07 10:49:48 +0000 +++ src/ICAP/ICAPXaction.cc 2009-01-29 14:50:26 +0000 @@ -76,7 +76,7 @@ disableRetries(); // this will also safely drain pconn pool // TODO: check whether NULL domain is appropriate here - connection = icapPconnPool->pop(s.cfg().host.buf(), s.cfg().port, NULL, client_addr, isRetriable); + connection = icapPconnPool->pop(s.cfg().host.unsafeBuf(), s.cfg().port, NULL, client_addr, isRetriable); if (connection >= 0) { debugs(93,3, HERE << "reused pconn FD " << connection); @@ -96,12 +96,12 @@ IpAddress outgoing; connection = comm_open(SOCK_STREAM, 0, outgoing, - COMM_NONBLOCKING, s.cfg().uri.buf()); + COMM_NONBLOCKING, s.cfg().uri.unsafeBuf()); if (connection < 0) dieOnConnectionFailure(); // throws - debugs(93,3, typeName << " opens connection to " << s.cfg().host.buf() << ":" << s.cfg().port); + debugs(93,3, typeName << " opens connection to " << s.cfg().host.unsafeBuf() << ":" << s.cfg().port); // TODO: service bypass status may differ from that of a transaction typedef CommCbMemFunT TimeoutDialer; @@ -119,7 +119,7 @@ typedef CommCbMemFunT ConnectDialer; connector = asyncCall(93,3, "ICAPXaction::noteCommConnected", ConnectDialer(this, &ICAPXaction::noteCommConnected)); - commConnectStart(connection, s.cfg().host.buf(), s.cfg().port, connector); + commConnectStart(connection, s.cfg().host.unsafeBuf(), s.cfg().port, connector); } /* @@ -157,7 +157,7 @@ debugs(93,3, HERE << "pushing pconn" << status()); AsyncCall::Pointer call = NULL; commSetTimeout(connection, -1, call); - icapPconnPool->push(connection, theService->cfg().host.buf(), + icapPconnPool->push(connection, theService->cfg().host.unsafeBuf(), theService->cfg().port, NULL, client_addr); disableRetries(); } else { @@ -232,7 +232,7 @@ { debugs(93, 2, HERE << typeName << " failed: timeout with " << theService->cfg().methodStr() << " " << - theService->cfg().uri.buf() << status()); + theService->cfg().uri.unsafeBuf() << status()); reuseConnection = false; service().noteFailure(); @@ -295,7 +295,7 @@ /* * See comments in ICAPXaction.h about why we use commBuf - * here instead of reading directly into readBuf.buf. + * here instead of reading directly into readBuf.unsafeBuf. */ typedef CommCbMemFunT Dialer; reader = asyncCall(93,3, "ICAPXaction::noteCommRead", @@ -320,7 +320,7 @@ /* * See comments in ICAPXaction.h about why we use commBuf - * here instead of reading directly into readBuf.buf. + * here instead of reading directly into readBuf.unsafeBuf. */ if (io.size > 0) { === modified file 'src/LoadableModule.cc' --- src/LoadableModule.cc 2008-10-10 08:02:53 +0000 +++ src/LoadableModule.cc 2009-02-03 17:36:15 +0000 @@ -67,7 +67,7 @@ void *LoadableModule::openModule(int mode) { # if XSTD_USE_LIBLTDL - return lt_dlopen(theName.buf()); + return lt_dlopen(theName.termedBuf()); # else return dlopen(theName.c_str(), mode == lmNow ? RTLD_NOW : RTLD_LAZY); === modified file 'src/SquidString.h' --- src/SquidString.h 2009-01-21 03:47:47 +0000 +++ src/SquidString.h 2009-02-04 22:39:55 +0000 @@ -95,10 +95,29 @@ * Retrieve a single character in the string. \param pos Position of character to retrieve. */ - _SQUID_INLINE_ char &operator [](unsigned int pos); + _SQUID_INLINE_ char operator [](unsigned int pos) const; _SQUID_INLINE_ int size() const; - _SQUID_INLINE_ char const * buf() const; + _SQUID_INLINE_ char const * unsafeBuf() const; + + /** + * \retval true the String has some contents + */ + _SQUID_INLINE_ bool defined() const; + /** + * \retval true the String does not hold any contents + */ + _SQUID_INLINE_ bool undefined() const; + /** + * Returns a raw pointer to the underlying backing store. The caller has been + * verified not to make any assumptions about null-termination + */ + _SQUID_INLINE_ char const * rawBuf() const; + /** + * Returns a raw pointer to the underlying backing store. + * The caller requires it to be null-terminated. + */ + _SQUID_INLINE_ char const * termedBuf() const; void limitInit(const char *str, int len); // TODO: rename to assign() void clean(); void reset(char const *str); @@ -109,12 +128,16 @@ void absorb(String &old); _SQUID_INLINE_ const char * pos(char const *) const; _SQUID_INLINE_ const char * pos(char const ch) const; + ///offset from string start of the first occurrence of ch + /// returns std::string::npos if ch is not found + _SQUID_INLINE_ size_t find(char const ch) const; _SQUID_INLINE_ const char * rpos(char const ch) const; _SQUID_INLINE_ int cmp (char const *) const; _SQUID_INLINE_ int cmp (char const *, size_t count) const; _SQUID_INLINE_ int cmp (String const &) const; _SQUID_INLINE_ int caseCmp (char const *) const; _SQUID_INLINE_ int caseCmp (char const *, size_t count) const; + _SQUID_INLINE_ int caseCmp (String const &) const; /** \deprecated Use assignment to [] position instead. * ie str[0] = 'h'; === modified file 'src/String.cc' --- src/String.cc 2009-01-21 03:47:47 +0000 +++ src/String.cc 2009-02-03 17:36:15 +0000 @@ -42,7 +42,7 @@ String::allocBuffer(size_t sz) { PROF_start(StringInitBuf); - assert (buf_ == NULL); + assert (undefined()); char *newBuffer = (char*)memAllocString(sz, &sz); setBuffer(newBuffer, sz); PROF_stop(StringInitBuf); @@ -53,7 +53,7 @@ void String::setBuffer(char *aBuf, size_t aSize) { - assert(!buf_); + assert(undefined()); assert(aSize < 65536); buf_ = aBuf; size_ = aSize; @@ -81,7 +81,7 @@ { clean(); // TODO: optimize to avoid cleaning the buffer we can use if (old.size() > 0) - allocAndFill(old.buf(), old.size()); + allocAndFill(old.rawBuf(), old.size()); return *this; } @@ -128,7 +128,7 @@ String::String (String const &old) : size_(0), len_(0), buf_(NULL) { if (old.size() > 0) - allocAndFill(old.buf(), old.size()); + allocAndFill(old.rawBuf(), old.size()); #if DEBUGSTRINGS StringRegistry::Instance().add(this); @@ -141,7 +141,7 @@ PROF_start(StringClean); assert(this); - if (buf()) + if (defined()) memFreeString(size_, buf_); len_ = 0; @@ -188,7 +188,7 @@ snew.allocBuffer(snew.len_ + 1); if (len_) - xmemcpy(snew.buf_, buf(), len_); + xmemcpy(snew.buf_, rawBuf(), len_); if (len) xmemcpy(snew.buf_ + len_, str, len); @@ -219,7 +219,7 @@ void String::append(String const &old) { - append (old.buf(), old.len_); + append (old.rawBuf(), old.len_); } void @@ -237,7 +237,7 @@ void String::stat(StoreEntry *entry) const { - storeAppendPrintf(entry, "%p : %d/%d \"%s\"\n",this,len_, size_, buf()); + storeAppendPrintf(entry, "%p : %d/%d \"%.*s\"\n",this,len_, size_, size(), rawBuf()); } StringRegistry & === modified file 'src/String.cci' --- src/String.cci 2009-01-21 03:47:47 +0000 +++ src/String.cci 2009-02-04 22:39:55 +0000 @@ -49,13 +49,35 @@ } char const * -String::buf() const -{ - return buf_; -} - -char& -String::operator [](unsigned int pos) +String::unsafeBuf() const +{ + return buf_; +} + +bool String::defined() const +{ + return buf_!=NULL; +} + +bool String::undefined() const +{ + return buf_==NULL; +} + +char const * +String::rawBuf() const +{ + return buf_; +} + +char const * +String::termedBuf() const +{ + return buf_; +} + +char +String::operator [](unsigned int pos) const { assert(pos < size_); @@ -65,19 +87,29 @@ const char * String::pos(char const *aString) const { - return strstr(buf(), aString); + return strstr(termedBuf(), aString); } const char * String::pos(char const ch) const { - return strchr(buf(), ch); + return strchr(termedBuf(), ch); +} + +size_t +String::find(char const ch) const +{ + const char *c; + c=pos(ch); + if (c==NULL) + return std::string::npos; + return c-rawBuf(); } const char * String::rpos(char const ch) const { - return strrchr(buf(), (ch)); + return strrchr(termedBuf(), (ch)); } int @@ -94,7 +126,7 @@ if (aString == NULL || aString[0] == '\0') return 1; - return strcmp(buf(), aString); + return strcmp(termedBuf(), aString); } int @@ -114,7 +146,7 @@ if (aString == NULL || aString[0] == '\0') return 1; - return strncmp(buf(), aString, count); + return strncmp(termedBuf(), aString, count); } int @@ -131,20 +163,27 @@ if (aString.size() == 0) return 1; - return strcmp(buf(), aString.buf()); + return strcmp(termedBuf(), aString.termedBuf()); } int String::caseCmp(char const *aString) const { - return strcasecmp(buf(), aString); + return strcasecmp(termedBuf(), aString); } int String::caseCmp(char const *aString, size_t count) const { - return strncasecmp(buf(), aString, count); -} + return strncasecmp(termedBuf(), aString, count); +} + +int +String::caseCmp(const String &str) const +{ + return caseCmp(str.rawBuf(),str.size()); +} + void String::set(char const *loc, char const ch) @@ -179,6 +218,6 @@ std::ostream & operator<<(std::ostream& os, String const &aString) { - os << aString.buf(); + os.write(aString.rawBuf(),aString.size()); return os; } === modified file 'src/access_log.cc' --- src/access_log.cc 2009-01-21 03:47:47 +0000 +++ src/access_log.cc 2009-01-29 14:50:26 +0000 @@ -625,7 +625,7 @@ if (al->request) sb = al->request->header.getByName(fmt->data.header.header); - out = sb.buf(); + out = sb.unsafeBuf(); quote = 1; @@ -635,7 +635,7 @@ if (al->reply) sb = al->reply->header.getByName(fmt->data.header.header); - out = sb.buf(); + out = sb.unsafeBuf(); quote = 1; @@ -645,7 +645,7 @@ if (al->request) sb = al->request->header.getByNameListMember(fmt->data.header.header, fmt->data.header.element, fmt->data.header.separator); - out = sb.buf(); + out = sb.unsafeBuf(); quote = 1; @@ -655,7 +655,7 @@ if (al->reply) sb = al->reply->header.getByNameListMember(fmt->data.header.header, fmt->data.header.element, fmt->data.header.separator); - out = sb.buf(); + out = sb.unsafeBuf(); quote = 1; @@ -764,7 +764,7 @@ case LFT_REQUEST_URLPATH: if (al->request) { - out = al->request->urlpath.buf(); + out = al->request->urlpath.unsafeBuf(); quote = 1; } break; @@ -810,7 +810,7 @@ case LFT_TAG: if (al->request) - out = al->request->tag.buf(); + out = al->request->tag.unsafeBuf(); quote = 1; @@ -823,7 +823,7 @@ case LFT_EXT_LOG: if (al->request) - out = al->request->extacl_log.buf(); + out = al->request->extacl_log.unsafeBuf(); quote = 1; === modified file 'src/adaptation/Config.cc' --- src/adaptation/Config.cc 2009-02-03 23:06:06 +0000 +++ src/adaptation/Config.cc 2009-02-03 23:13:10 +0000 @@ -68,8 +68,8 @@ typedef Services::iterator SCI; for (SCI i = AllServices().begin(); i != AllServices().end(); ++i) { const ServiceConfig &cfg = (*i)->cfg(); - storeAppendPrintf(entry, "%s %s_%s %s %d %s\n", name, cfg.key.buf(), - cfg.methodStr(), cfg.vectPointStr(), cfg.bypass, cfg.uri.buf()); + storeAppendPrintf(entry, "%s %.*s_%s %s %d %.*s\n", name, cfg.key.size(), cfg.key.rawBuf(), + cfg.methodStr(), cfg.vectPointStr(), cfg.bypass, cfg.uri.size(), cfg.uri.rawBuf()); } } @@ -141,7 +141,7 @@ { typedef Groups::iterator GI; for (GI i = AllGroups().begin(); i != AllGroups().end(); ++i) - storeAppendPrintf(entry, "%s %s\n", name, (*i)->id.buf()); + storeAppendPrintf(entry, "%s %s\n", name, (*i)->id.unsafeBuf()); } void @@ -181,7 +181,7 @@ typedef AccessRules::iterator CI; for (CI i = AllRules().begin(); i != AllRules().end(); ++i) { - snprintf(nom, 64, "%s %s", name, (*i)->groupId.buf()); + snprintf(nom, 64, "%s %s", name, (*i)->groupId.unsafeBuf()); dump_acl_access(entry, nom, (*i)->acl); } } === modified file 'src/adaptation/ServiceConfig.cc' --- src/adaptation/ServiceConfig.cc 2009-02-03 23:06:06 +0000 +++ src/adaptation/ServiceConfig.cc 2009-02-03 23:13:10 +0000 @@ -63,7 +63,7 @@ ConfigParser::ParseString(&uri); debugs(3, 5, HERE << cfg_filename << ':' << config_lineno << ": " << - key.buf() << " " << method_point << " " << bypass); + key << " " << method_point << " " << bypass); method = parseMethod(method_point); point = parseVectPoint(method_point); @@ -77,14 +77,14 @@ // extract scheme and use it as the service_configConfig protocol const char *schemeSuffix = "://"; if (const char *schemeEnd = uri.pos(schemeSuffix)) - protocol.limitInit(uri.buf(), schemeEnd - uri.buf()); + protocol.limitInit(uri.rawBuf(), schemeEnd - uri.rawBuf()); //substring debugs(3, 5, HERE << cfg_filename << ':' << config_lineno << ": " << "service protocol is " << protocol); if (!protocol.size()) return false; // skip scheme - const char *s = uri.buf() + protocol.size() + strlen(schemeSuffix); + const char *s = uri.termedBuf() + protocol.size() + strlen(schemeSuffix); const char *e; === modified file 'src/client_side.cc' --- src/client_side.cc 2009-02-04 09:52:20 +0000 +++ src/client_side.cc 2009-02-04 13:48:24 +0000 @@ -464,7 +464,7 @@ aLogEntry->http.version = request->http_ver; aLogEntry->hier = request->hier; aLogEntry->cache.requestSize += request->content_length; - aLogEntry->cache.extuser = request->extacl_user.buf(); + aLogEntry->cache.extuser = request->extacl_user.termedBuf(); if (request->auth_user_request) { @@ -486,10 +486,10 @@ if (al.reply) { al.http.code = al.reply->sline.status; - al.http.content_type = al.reply->content_type.buf(); + al.http.content_type = al.reply->content_type.termedBuf(); } else if (loggingEntry() && loggingEntry()->mem_obj) { al.http.code = loggingEntry()->mem_obj->getReply()->sline.status; - al.http.content_type = loggingEntry()->mem_obj->getReply()->content_type.buf(); + al.http.content_type = loggingEntry()->mem_obj->getReply()->content_type.unsafeBuf(); } debugs(33, 9, "clientLogRequest: http.code='" << al.http.code << "'"); @@ -852,7 +852,7 @@ static void clientPackTermBound(String boundary, MemBuf * mb) { - mb->Printf("\r\n--%s--\r\n", boundary.buf()); + mb->Printf("\r\n--%.*s--\r\n", boundary.size(), boundary.rawBuf()); debugs(33, 6, "clientPackTermBound: buf offset: " << mb->size); } @@ -866,10 +866,9 @@ assert(spec); /* put boundary */ - debugs(33, 5, "clientPackRangeHdr: appending boundary: " << - boundary.buf()); + debugs(33, 5, "clientPackRangeHdr: appending boundary: " << boundary); /* rfc2046 requires to _prepend_ boundary with ! */ - mb->Printf("\r\n--%s\r\n", boundary.buf()); + mb->Printf("\r\n--%.*s\r\n", boundary.size(), boundary.rawBuf()); /* stuff the header with required entries and pack it */ @@ -891,7 +890,7 @@ } /** - * extracts a "range" from *buf and appends them to mb, updating + * extracts a "range" from *unsafeBuf and appends them to mb, updating * all offsets and such. */ void @@ -1170,7 +1169,7 @@ hdr->delById(HDR_CONTENT_TYPE); httpHeaderPutStrf(hdr, HDR_CONTENT_TYPE, "multipart/byteranges; boundary=\"%s\"", - http->range_iter.boundary.buf()); + http->range_iter.boundary.unsafeBuf()); /* Content-Length is not required in multipart responses * but it is always nice to have one */ actual_clen = http->mRangeCLen(); @@ -1924,7 +1923,7 @@ req_sz = HttpParserReqSz(hp); } - /* We know the whole request is in hp->buf now */ + /* We know the whole request is in hp->unsafeBuf now */ assert(req_sz <= (size_t) hp->bufsiz); @@ -2271,11 +2270,11 @@ request->flags.spoof_client_ip = conn->port->spoof_client_ip; } - if (internalCheck(request->urlpath.buf())) { + if (internalCheck(request->urlpath.termedBuf())) { if (internalHostnameIs(request->GetHost()) && request->port == getMyPort()) { http->flags.internal = 1; - } else if (Config.onoff.global_internal_static && internalStaticCheck(request->urlpath.buf())) { + } else if (Config.onoff.global_internal_static && internalStaticCheck(request->urlpath.termedBuf())) { request->SetHost(internalHostname()); request->port = getMyPort(); http->flags.internal = 1; @@ -2623,7 +2622,7 @@ } /** - * called when new request body data has been buffered in in.buf + * called when new request body data has been buffered in in.unsafeBuf * may close the connection if we were closing and piped everything out */ void === modified file 'src/client_side_reply.cc' --- src/client_side_reply.cc 2009-02-04 09:52:20 +0000 +++ src/client_side_reply.cc 2009-02-04 13:48:24 +0000 @@ -1291,7 +1291,7 @@ int connection_auth_blocked = 0; while ((e = hdr->getEntry(&pos))) { if (e->id == HDR_WWW_AUTHENTICATE) { - const char *value = e->value.buf(); + const char *value = e->value.rawBuf(); if ((strncasecmp(value, "NTLM", 4) == 0 && (value[4] == '\0' || value[4] == ' ')) @@ -1391,7 +1391,7 @@ ThisCache); strListAdd(&strVia, bbuf, ','); hdr->delById(HDR_VIA); - hdr->putStr(HDR_VIA, strVia.buf()); + hdr->putStr(HDR_VIA, strVia.termedBuf()); } /* Signal keep-alive if needed */ hdr->putStr(http->flags.accel ? HDR_CONNECTION : HDR_PROXY_CONNECTION, @@ -1671,7 +1671,7 @@ } /* - * accepts chunk of a http message in buf, parses prefix, filters headers and + * accepts chunk of a http message in unsafeBuf, parses prefix, filters headers and * such, writes processed message to the message recipient */ void === modified file 'src/client_side_request.cc' --- src/client_side_request.cc 2009-02-04 09:52:20 +0000 +++ src/client_side_request.cc 2009-02-04 22:39:55 +0000 @@ -426,7 +426,7 @@ const char *asciiaddr; int l; struct in_addr addr; - p = request->x_forwarded_for_iterator.buf(); + p = request->x_forwarded_for_iterator.unsafeBuf(); l = request->x_forwarded_for_iterator.size(); /* @@ -856,7 +856,7 @@ int may_pin = 0; while ((e = req_hdr->getEntry(&pos))) { if (e->id == HDR_AUTHORIZATION || e->id == HDR_PROXY_AUTHORIZATION) { - const char *value = e->value.buf(); + const char *value = e->value.rawBuf(); if (strncasecmp(value, "NTLM ", 5) == 0 || strncasecmp(value, "Negotiate ", 10) == 0 @@ -897,7 +897,7 @@ } #if FORW_VIA_DB - fvdbCountVia(s.buf()); + fvdbCountVia(s.unsafeBuf()); #endif @@ -923,7 +923,7 @@ if (req_hdr->has(HDR_X_FORWARDED_FOR)) { String s = req_hdr->getList(HDR_X_FORWARDED_FOR); - fvdbCountForw(s.buf()); + fvdbCountForw(s.unsafeBuf()); s.clean(); } === modified file 'src/eCAP/MessageRep.cc' --- src/eCAP/MessageRep.cc 2008-10-10 08:02:53 +0000 +++ src/eCAP/MessageRep.cc 2009-01-29 16:14:56 +0000 @@ -39,7 +39,7 @@ const String value = squidId == HDR_OTHER ? theHeader.getByName(name.image().c_str()) : theHeader.getStrOrList(squidId); - return Value::FromTempString(value.buf()); + return Value::FromTempString(value.termedBuf()); } void @@ -192,7 +192,7 @@ Ecap::RequestLineRep::Area Ecap::RequestLineRep::uri() const { - return Area::FromTempBuffer(theMessage.urlpath.buf(), + return Area::FromTempBuffer(theMessage.urlpath.unsafeBuf(), theMessage.urlpath.size()); } === modified file 'src/eCAP/ServiceRep.cc' --- src/eCAP/ServiceRep.cc 2008-10-10 08:02:53 +0000 +++ src/eCAP/ServiceRep.cc 2009-01-29 16:14:56 +0000 @@ -56,7 +56,7 @@ bool Ecap::ServiceRep::wantsUrl(const String &urlPath) const { Must(up()); - return theService->wantsUrl(urlPath.buf()); + return theService->wantsUrl(urlPath.termedBuf()); } Adaptation::Initiate * === modified file 'src/errorpage.cc' --- src/errorpage.cc 2009-01-21 03:47:47 +0000 +++ src/errorpage.cc 2009-01-29 14:50:26 +0000 @@ -558,7 +558,7 @@ Packer p; str.Printf("%s %s HTTP/%d.%d\n", RequestMethodStr(request->method), - request->urlpath.size() ? request->urlpath.buf() : "/", + request->urlpath.size() ? request->urlpath.unsafeBuf() : "/", request->http_ver.major, request->http_ver.minor); packerToMemInit(&p, &str); request->header.packInto(&p); @@ -736,7 +736,7 @@ Packer p; mb.Printf("%s %s HTTP/%d.%d\n", RequestMethodStr(request->method), - request->urlpath.size() ? request->urlpath.buf() : "/", + request->urlpath.size() ? request->urlpath.unsafeBuf() : "/", request->http_ver.major, request->http_ver.minor); packerToMemInit(&p, &mb); request->header.packInto(&p); @@ -928,7 +928,7 @@ */ if (!Config.errorDirectory && request && request->header.getList(HDR_ACCEPT_LANGUAGE, &hdr) ) { - const char *buf = hdr.buf(); // raw header string for parsing + const char *unsafeBuf = hdr.unsafeBuf(); // raw header string for parsing int pos = 0; // current parsing position in header string char *reset = NULL; // where to reset the p pointer for each new tag file char *dt = NULL; @@ -950,12 +950,12 @@ * - IFF a tag contains only two characters we can wildcard ANY translations matching: '-'? .* * with preference given to an exact match. */ - while (pos < hdr.size() && buf[pos] != ';' && buf[pos] != ',' && !xisspace(buf[pos]) && dt < (dir+256) ) { - *dt++ = xtolower(buf[pos++]); + while (pos < hdr.size() && unsafeBuf[pos] != ';' && unsafeBuf[pos] != ',' && !xisspace(unsafeBuf[pos]) && dt < (dir+256) ) { + *dt++ = xtolower(unsafeBuf[pos++]); } *dt++ = '\0'; // nul-terminated the filename content string before system use. - debugs(4, 9, HERE << "STATE: dt='" << dt << "', reset='" << reset << "', reset[1]='" << reset[1] << "', pos=" << pos << ", buf='" << &buf[pos] << "'"); + debugs(4, 9, HERE << "STATE: dt='" << dt << "', reset='" << reset << "', reset[1]='" << reset[1] << "', pos=" << pos << ", buf='" << &unsafeBuf[pos] << "'"); /* if we found anything we might use, try it. */ if (*reset != '\0') { @@ -983,8 +983,8 @@ dt = reset; // reset for next tag testing. we replace the failed name instead of cloning. // IFF we terminated the tag on ';' we need to skip the 'q=' bit to the next ',' or end. - while (pos < hdr.size() && buf[pos] != ',') pos++; - if (buf[pos] == ',') pos++; + while (pos < hdr.size() && unsafeBuf[pos] != ',') pos++; + if (unsafeBuf[pos] == ',') pos++; } } #endif /* USE_ERR_LOCALES */ === modified file 'src/external_acl.cc' --- src/external_acl.cc 2009-02-04 20:21:36 +0000 +++ src/external_acl.cc 2009-02-05 10:59:06 +0000 @@ -753,7 +753,7 @@ external_acl_cache_touch(acl->def, entry); result = entry->result; - external_acl_message = entry->message.buf(); + external_acl_message = entry->message.unsafeBuf(); debugs(82, 2, "aclMatchExternal: " << acl->def->name << " = " << result); @@ -881,7 +881,7 @@ break; case _external_acl_format::EXT_ACL_PATH: - str = request->urlpath.buf(); + str = request->urlpath.termedBuf(); break; case _external_acl_format::EXT_ACL_METHOD: @@ -890,49 +890,49 @@ case _external_acl_format::EXT_ACL_HEADER_REQUEST: sb = request->header.getByName(format->header); - str = sb.buf(); + str = sb.termedBuf(); break; case _external_acl_format::EXT_ACL_HEADER_REQUEST_ID: sb = request->header.getStrOrList(format->header_id); - str = sb.buf(); + str = sb.termedBuf(); break; case _external_acl_format::EXT_ACL_HEADER_REQUEST_MEMBER: sb = request->header.getByNameListMember(format->header, format->member, format->separator); - str = sb.buf(); + str = sb.termedBuf(); break; case _external_acl_format::EXT_ACL_HEADER_REQUEST_ID_MEMBER: sb = request->header.getListMember(format->header_id, format->member, format->separator); - str = sb.buf(); + str = sb.termedBuf(); break; case _external_acl_format::EXT_ACL_HEADER_REPLY: if (reply) { sb = reply->header.getByName(format->header); - str = sb.buf(); + str = sb.termedBuf(); } break; case _external_acl_format::EXT_ACL_HEADER_REPLY_ID: if (reply) { sb = reply->header.getStrOrList(format->header_id); - str = sb.buf(); + str = sb.termedBuf(); } break; case _external_acl_format::EXT_ACL_HEADER_REPLY_MEMBER: if (reply) { sb = reply->header.getByNameListMember(format->header, format->member, format->separator); - str = sb.buf(); + str = sb.termedBuf(); } break; case _external_acl_format::EXT_ACL_HEADER_REPLY_ID_MEMBER: if (reply) { sb = reply->header.getListMember(format->header_id, format->member, format->separator); - str = sb.buf(); + str = sb.termedBuf(); } break; #if USE_SSL @@ -983,7 +983,7 @@ #endif case _external_acl_format::EXT_ACL_EXT_USER: - str = request->extacl_user.buf(); + str = request->extacl_user.termedBuf(); break; case _external_acl_format::EXT_ACL_UNKNOWN: @@ -1332,8 +1332,8 @@ if (entry != NULL) { debugs(82, 4, "externalAclLookup: entry = { date=" << (long unsigned int) entry->date << ", result=" << - entry->result << ", user=" << entry->user.buf() << " tag=" << - entry->tag.buf() << " log=" << entry->log.buf() << " }"); + entry->result << ", user=" << entry->user << " tag=" << + entry->tag << " log=" << entry->log << " }"); } === modified file 'src/fs/coss/store_dir_coss.cc' --- src/fs/coss/store_dir_coss.cc 2009-01-21 03:47:47 +0000 +++ src/fs/coss/store_dir_coss.cc 2009-01-29 16:14:56 +0000 @@ -1175,7 +1175,7 @@ if (!stripe_path) { String result = path; result.append("/stripe"); - const_cast(this)->stripe_path = xstrdup(result.buf()); + const_cast(this)->stripe_path = xstrdup(result.termedBuf()); } return stripe_path; === modified file 'src/ftp.cc' --- src/ftp.cc 2009-02-03 20:53:43 +0000 +++ src/ftp.cc 2009-02-03 23:13:10 +0000 @@ -567,7 +567,7 @@ wordlist *w; char *dirup; int i, j, k; - const char *title = title_url.buf(); + const char *title = title_url.termedBuf(); flags.listing_started = true; printfReplyBody("\n"); printfReplyBody("\n", @@ -586,7 +586,7 @@ if (flags.need_base_href) printfReplyBody("\n", - html_quote(base_href.buf())); + html_quote(base_href.termedBuf())); printfReplyBody("\n"); @@ -1013,7 +1013,7 @@ if (flags.dir_slash) { url = xstrdup("./"); } else { - const char *title = title_url.buf(); + const char *title = title_url.termedBuf(); int k = 6 + strcspn(&title[6], "/"); char *t; url = xstrdup(title + k); @@ -1150,7 +1150,7 @@ FtpStateData::parseListing() { char *buf = data.readBuf->content(); - char *sbuf; /* NULL-terminated copy of buf */ + char *sbuf; /* NULL-terminated copy of termedBuf */ char *end; char *line; char *s; @@ -1469,7 +1469,7 @@ /* UNIX root directory */ flags.isdir = 1; flags.root_dir = 1; - } else if ((l >= 1) && (*(request->urlpath.buf() + l - 1) == '/')) { + } else if ((l >= 1) && (request->urlpath[l - 1] == '/')) { /* Directory URL, ending in / */ flags.isdir = 1; @@ -1558,7 +1558,7 @@ checkUrlpath(); buildTitleUrl(); debugs(9, 5, HERE << "host=" << request->GetHost() << ", path=" << - request->urlpath.buf() << ", user=" << user << ", passwd=" << + request->urlpath << ", user=" << user << ", passwd=" << password); state = BEGIN; @@ -2009,7 +2009,7 @@ mode = 'A'; } else { t = ftpState->request->urlpath.rpos('/'); - filename = t ? t + 1 : ftpState->request->urlpath.buf(); + filename = t ? t + 1 : ftpState->request->urlpath.termedBuf(); mode = mimeGetTransferMode(filename); } @@ -2038,7 +2038,7 @@ debugs(9, 3, HERE); if (code == 200) { - p = path = xstrdup(ftpState->request->urlpath.buf()); + p = path = xstrdup(ftpState->request->urlpath.termedBuf()); if (*p == '/') p++; @@ -2292,7 +2292,7 @@ if (ftpState->theSize == 0) { debugs(9, 2, "SIZE reported " << ftpState->ctrl.last_reply << " on " << - ftpState->title_url.buf()); + ftpState->title_url); ftpState->theSize = -1; } } else if (code < 0) { @@ -3380,7 +3380,7 @@ safe_free(ftpState->filepath); /* Build the new path (urlpath begins with /) */ - path = xstrdup(ftpState->request->urlpath.buf()); + path = xstrdup(ftpState->request->urlpath.termedBuf()); rfc1738_unescape(path); @@ -3624,7 +3624,7 @@ e->buffer(); /* released when done processing current data payload */ - filename = (t = urlpath.rpos('/')) ? t + 1 : urlpath.buf(); + filename = (t = urlpath.rpos('/')) ? t + 1 : urlpath.termedBuf(); if (flags.isdir) { mime_type = "text/html"; @@ -3737,12 +3737,12 @@ if (request->protocol != PROTO_FTP) return NULL; - if ( !strncmp(request->urlpath.buf(), "/", 1) ) { + if ( request->urlpath[0]=='/' ) { newbuf.append(request->urlpath); request->urlpath.absorb(newbuf); safe_free(request->canonical); - } else if ( !strncmp(request->urlpath.buf(), "%2f", 3) ) { - newbuf.append(request->urlpath.buf() +1); + } else if ( !strncmp(request->urlpath.termedBuf(), "%2f", 3) ) { + newbuf.append(request->urlpath.rawBuf() +1, request->urlpath.size()-1); request->urlpath.absorb(newbuf); safe_free(request->canonical); } === modified file 'src/gopher.cc' --- src/gopher.cc 2009-01-21 03:47:47 +0000 +++ src/gopher.cc 2009-01-31 16:40:06 +0000 @@ -277,7 +277,7 @@ static void gopher_request_parse(const HttpRequest * req, char *type_id, char *request) { - const char *path = req->urlpath.buf(); + const char *path = req->urlpath.termedBuf(); if (request) request[0] = '\0'; @@ -751,7 +751,7 @@ } /* while loop */ if (outbuf.size() > 0) { - entry->append(outbuf.buf(), outbuf.size()); + entry->append(outbuf.rawBuf(), outbuf.size()); /* now let start sending stuff to client */ entry->flush(); } @@ -853,7 +853,7 @@ do_next_read = 0; } else if (len == 0) { /* Connection closed; retrieval done. */ - /* flush the rest of data in temp buf if there is one. */ + /* flush the rest of data in temp unsafeBuf if there is one. */ if (gopherState->conversion != gopher_ds::NORMAL) gopherEndHTML(gopherState); === modified file 'src/http.cc' --- src/http.cc 2009-01-21 03:47:47 +0000 +++ src/http.cc 2009-01-31 17:04:05 +0000 @@ -93,7 +93,7 @@ const char *url; if (_peer->options.originserver) - url = orig_request->urlpath.buf(); + url = orig_request->urlpath.termedBuf(); else url = entry->url(); @@ -578,7 +578,7 @@ strListAdd(&vstr, name, ','); hdr = request->header.getByName(name); safe_free(name); - value = hdr.buf(); + value = hdr.termedBuf(); if (value) { value = rfc1738_escape_part(value); @@ -603,7 +603,7 @@ strListAdd(&vstr, name, ','); hdr = request->header.getByName(name); safe_free(name); - value = hdr.buf(); + value = hdr.termedBuf(); if (value) { value = rfc1738_escape_part(value); @@ -618,8 +618,8 @@ vary.clean(); #endif - debugs(11, 3, "httpMakeVaryMark: " << vstr.buf()); - return vstr.buf(); + debugs(11, 3, "httpMakeVaryMark: " << vstr); + return vstr.termedBuf(); } void @@ -791,7 +791,7 @@ header = hdr->getStrOrList(HDR_PROXY_SUPPORT); /* XXX This ought to be done in a case-insensitive manner */ - rc = (strstr(header.buf(), "Session-Based-Authentication") != NULL); + rc = (strstr(header.termedBuf(), "Session-Based-Authentication") != NULL); return rc; } @@ -1454,7 +1454,7 @@ orig_request->http_ver.major, orig_request->http_ver.minor, ThisCache); strListAdd(&strVia, bbuf, ','); - hdr_out->putStr(HDR_VIA, strVia.buf()); + hdr_out->putStr(HDR_VIA, strVia.termedBuf()); strVia.clean(); } @@ -1465,7 +1465,7 @@ snprintf(bbuf, BBUF_SZ, "%s=\"Surrogate/1.0 ESI/1.0\"", Config.Accel.surrogate_id); strListAdd(&strSurrogate, bbuf, ','); - hdr_out->putStr(HDR_SURROGATE_CAPABILITY, strSurrogate.buf()); + hdr_out->putStr(HDR_SURROGATE_CAPABILITY, strSurrogate.termedBuf()); } #endif @@ -1495,7 +1495,7 @@ strFwd = orig_request->client_addr.NtoA(ntoabuf, MAX_IPSTRLEN); } if (strFwd.size() > 0) - hdr_out->putStr(HDR_X_FORWARDED_FOR, strFwd.buf()); + hdr_out->putStr(HDR_X_FORWARDED_FOR, strFwd.termedBuf()); } /** If set to DELETE - do not copy through. */ strFwd.clean(); @@ -1531,7 +1531,7 @@ const char *username = "-"; if (orig_request->extacl_user.size()) - username = orig_request->extacl_user.buf(); + username = orig_request->extacl_user.termedBuf(); else if (orig_request->auth_user_request) username = orig_request->auth_user_request->username(); @@ -1542,7 +1542,11 @@ } else if (strcmp(orig_request->peer_login, "PASS") == 0) { if (orig_request->extacl_user.size() && orig_request->extacl_passwd.size()) { char loginbuf[256]; - snprintf(loginbuf, sizeof(loginbuf), "%s:%s", orig_request->extacl_user.buf(), orig_request->extacl_passwd.buf()); + snprintf(loginbuf, sizeof(loginbuf), "%.*s:%.*s", + orig_request->extacl_user.size(), + orig_request->extacl_user.rawBuf(), + orig_request->extacl_passwd.size(), + orig_request->extacl_passwd.rawBuf()); httpHeaderPutStrf(hdr_out, HDR_PROXY_AUTHORIZATION, "Basic %s", base64_encode(loginbuf)); } @@ -1569,7 +1573,11 @@ hdr_out->putStr(HDR_AUTHORIZATION, auth); } else if (orig_request->extacl_user.size() && orig_request->extacl_passwd.size()) { char loginbuf[256]; - snprintf(loginbuf, sizeof(loginbuf), "%s:%s", orig_request->extacl_user.buf(), orig_request->extacl_passwd.buf()); + snprintf(loginbuf, sizeof(loginbuf), "%.*s:%.*s", + orig_request->extacl_user.size(), + orig_request->extacl_user.rawBuf(), + orig_request->extacl_passwd.size(), + orig_request->extacl_passwd.rawBuf()); httpHeaderPutStrf(hdr_out, HDR_AUTHORIZATION, "Basic %s", base64_encode(loginbuf)); } @@ -1581,7 +1589,7 @@ if (orig_request->auth_user_request) username = orig_request->auth_user_request->username(); else if (orig_request->extacl_user.size()) - username = orig_request->extacl_user.buf(); + username = orig_request->extacl_user.termedBuf(); snprintf(loginbuf, sizeof(loginbuf), "%s%s", username, orig_request->peer_login + 1); @@ -1613,7 +1621,7 @@ httpHdrCcSetMaxAge(cc, getMaxAge(url)); if (request->urlpath.size()) - assert(strstr(url, request->urlpath.buf())); + assert(strstr(url, request->urlpath.termedBuf())); } /* Enforce sibling relations */ @@ -1650,10 +1658,10 @@ void copyOneHeaderFromClientsideRequestToUpstreamRequest(const HttpHeaderEntry *e, String strConnection, HttpRequest * request, HttpRequest * orig_request, HttpHeader * hdr_out, int we_do_ranges, http_state_flags flags) { - debugs(11, 5, "httpBuildRequestHeader: " << e->name.buf() << ": " << e->value.buf()); + debugs(11, 5, "httpBuildRequestHeader: " << e->name << ": " << e->value ); if (!httpRequestHdrAllowed(e, &strConnection)) { - debugs(11, 2, "'" << e->name.buf() << "' header denied by anonymize_headers configuration"); + debugs(11, 2, "'" << e->name << "' header denied by anonymize_headers configuration"); return; } @@ -1814,7 +1822,7 @@ HttpVersion httpver(1, 0); mb->Printf("%s %s HTTP/%d.%d\r\n", RequestMethodStr(request->method), - request->urlpath.size() ? request->urlpath.buf() : "/", + request->urlpath.size() ? request->urlpath.termedBuf() : "/", httpver.major,httpver.minor); /* build and pack headers */ { === modified file 'src/internal.cc' --- src/internal.cc 2009-01-21 03:47:47 +0000 +++ src/internal.cc 2009-02-03 17:36:15 +0000 @@ -51,7 +51,7 @@ internalStart(HttpRequest * request, StoreEntry * entry) { ErrorState *err; - const char *upath = request->urlpath.buf(); + const char *upath = request->urlpath.termedBuf(); debugs(76, 3, "internalStart: " << request->client_addr << " requesting '" << upath << "'"); if (0 == strcmp(upath, "/squid-internal-dynamic/netdb")) { === modified file 'src/peer_digest.cc' --- src/peer_digest.cc 2009-01-21 03:47:47 +0000 +++ src/peer_digest.cc 2009-01-29 14:50:26 +0000 @@ -231,7 +231,7 @@ { eventAdd("peerDigestCheck", peerDigestCheck, pd, (double) delay, 1); pd->times.next_check = squid_curtime + delay; - debugs(72, 3, "peerDigestSetCheck: will check peer " << pd->host.buf() << " in " << delay << " secs"); + debugs(72, 3, "peerDigestSetCheck: will check peer " << pd->host.unsafeBuf() << " in " << delay << " secs"); } /* @@ -241,10 +241,10 @@ peerDigestNotePeerGone(PeerDigest * pd) { if (pd->flags.requested) { - debugs(72, 2, "peerDigest: peer " << pd->host.buf() << " gone, will destroy after fetch."); + debugs(72, 2, "peerDigest: peer " << pd->host.unsafeBuf() << " gone, will destroy after fetch."); /* do nothing now, the fetching chain will notice and take action */ } else { - debugs(72, 2, "peerDigest: peer " << pd->host.buf() << " is gone, destroying now."); + debugs(72, 2, "peerDigest: peer " << pd->host.unsafeBuf() << " is gone, destroying now."); peerDigestDestroy(pd); } } @@ -279,7 +279,7 @@ /* per-peer limit */ if (req_time - pd->times.received < PeerDigestReqMinGap) { - debugs(72, 2, "peerDigestCheck: " << pd->host.buf() << + debugs(72, 2, "peerDigestCheck: " << pd->host.unsafeBuf() << ", avoiding close peer requests (" << (int) (req_time - pd->times.received) << " < " << (int) PeerDigestReqMinGap << " secs)."); @@ -289,7 +289,7 @@ /* global limit */ if (req_time - pd_last_req_time < GlobDigestReqMinGap) { - debugs(72, 2, "peerDigestCheck: " << pd->host.buf() << + debugs(72, 2, "peerDigestCheck: " << pd->host.unsafeBuf() << ", avoiding close requests (" << (int) (req_time - pd_last_req_time) << " < " << (int) GlobDigestReqMinGap << " secs)."); @@ -544,7 +544,7 @@ assert(reply); assert (reply->sline.status != 0); status = reply->sline.status; - debugs(72, 3, "peerDigestFetchReply: " << pd->host.buf() << " status: " << status << + debugs(72, 3, "peerDigestFetchReply: " << pd->host.unsafeBuf() << " status: " << status << ", expires: " << (long int) reply->expires << " (" << std::showpos << (int) (reply->expires - squid_curtime) << ")"); @@ -634,7 +634,7 @@ assert (fetch->entry->getReply()->sline.status != 0); if (fetch->entry->getReply()->sline.status != HTTP_OK) { - debugs(72, 1, "peerDigestSwapInHeaders: " << fetch->pd->host.buf() << + debugs(72, 1, "peerDigestSwapInHeaders: " << fetch->pd->host.unsafeBuf() << " status " << fetch->entry->getReply()->sline.status << " got cached!"); @@ -762,7 +762,7 @@ #endif else - host = pd->host.buf(); + host = pd->host.unsafeBuf(); } debugs(72, 6, step_name << ": peer " << host << ", offset: " << @@ -813,7 +813,7 @@ peerDigestFetchStop(DigestFetchState * fetch, char *buf, const char *reason) { assert(reason); - debugs(72, 2, "peerDigestFetchStop: peer " << fetch->pd->host.buf() << ", reason: " << reason); + debugs(72, 2, "peerDigestFetchStop: peer " << fetch->pd->host.unsafeBuf() << ", reason: " << reason); peerDigestReqFinish(fetch, buf, 1, 1, 1, reason, 0); } @@ -822,7 +822,7 @@ peerDigestFetchAbort(DigestFetchState * fetch, char *buf, const char *reason) { assert(reason); - debugs(72, 2, "peerDigestFetchAbort: peer " << fetch->pd->host.buf() << ", reason: " << reason); + debugs(72, 2, "peerDigestFetchAbort: peer " << fetch->pd->host.unsafeBuf() << ", reason: " << reason); peerDigestReqFinish(fetch, buf, 1, 1, 1, reason, 1); } @@ -872,7 +872,7 @@ peerDigestPDFinish(DigestFetchState * fetch, int pcb_valid, int err) { PeerDigest *pd = fetch->pd; - const char *host = pd->host.buf(); + const char *host = pd->host.unsafeBuf(); pd->times.received = squid_curtime; pd->times.req_delay = fetch->resp_time; @@ -986,7 +986,7 @@ { StoreDigestCBlock cblock; int freed_size = 0; - const char *host = pd->host.buf(); + const char *host = pd->host.unsafeBuf(); xmemcpy(&cblock, buf, sizeof(cblock)); /* network -> host conversions */ @@ -1080,7 +1080,7 @@ const int bit_util = cacheDigestBitUtil(pd->cd); if (bit_util > 65) { - debugs(72, 0, "Warning: " << pd->host.buf() << + debugs(72, 0, "Warning: " << pd->host.unsafeBuf() << " peer digest has too many bits on (" << bit_util << "%%)."); return 0; @@ -1106,7 +1106,7 @@ assert(pd); - const char *host = pd->host.buf(); + const char *host = pd->host.unsafeBuf(); storeAppendPrintf(e, "\npeer digest from %s\n", host); cacheDigestGuessStatsReport(&pd->stats.guess, e, host); === modified file 'src/redirect.cc' --- src/redirect.cc 2009-01-21 03:47:47 +0000 +++ src/redirect.cc 2009-02-03 17:36:15 +0000 @@ -137,8 +137,8 @@ if (http->request->auth_user_request) r->client_ident = http->request->auth_user_request->username(); - else if (http->request->extacl_user.buf() != NULL) { - r->client_ident = http->request->extacl_user.buf(); + else if (http->request->extacl_user.defined()) { + r->client_ident = http->request->extacl_user.termedBuf(); } if (!r->client_ident && (conn != NULL && conn->rfc931[0])) === modified file 'src/stat.cc' --- src/stat.cc 2009-01-21 03:47:47 +0000 +++ src/stat.cc 2009-02-03 17:36:15 +0000 @@ -1653,8 +1653,8 @@ if (http->request->auth_user_request) p = http->request->auth_user_request->username(); - else if (http->request->extacl_user.buf() != NULL) { - p = http->request->extacl_user.buf(); + else if (http->request->extacl_user.defined()) { + p = http->request->extacl_user.termedBuf(); } if (!p && (conn != NULL && conn->rfc931[0])) === modified file 'src/store.cc' --- src/store.cc 2009-01-21 03:47:47 +0000 +++ src/store.cc 2009-02-04 23:25:42 +0000 @@ -689,16 +689,16 @@ if (vary.size()) { /* Again, we own this structure layout */ - rep->header.putStr(HDR_VARY, vary.buf()); + rep->header.putStr(HDR_VARY, vary.termedBuf()); vary.clean(); } #if X_ACCELERATOR_VARY vary = mem_obj->getReply()->header.getList(HDR_X_ACCELERATOR_VARY); - if (vary.buf()) { + if (vary.unsafeBuf()) { /* Again, we own this structure layout */ - rep->header.putStr(HDR_X_ACCELERATOR_VARY, vary.buf()); + rep->header.putStr(HDR_X_ACCELERATOR_VARY, vary.unsafeBuf()); vary.clean(); } === modified file 'src/store_log.cc' --- src/store_log.cc 2009-01-21 03:47:47 +0000 +++ src/store_log.cc 2009-01-29 14:50:26 +0000 @@ -86,7 +86,7 @@ (int) reply->date, (int) reply->last_modified, (int) reply->expires, - reply->content_type.size() ? reply->content_type.buf() : "unknown", + reply->content_type.size() ? reply->content_type.unsafeBuf() : "unknown", reply->content_length, e->contentLen(), RequestMethodStr(mem->method), === modified file 'src/tests/testEvent.cc' --- src/tests/testEvent.cc 2008-10-10 08:02:53 +0000 +++ src/tests/testEvent.cc 2009-01-30 14:55:22 +0000 @@ -98,19 +98,19 @@ printf("Actual Text:\n"); /* TODO: these should really be just [] lookups, but String doesn't have those here yet. */ for ( int i = 0; i < anEntry->_appended_text.size(); i++) { - CPPUNIT_ASSERT( expect.buf()[i] ); - CPPUNIT_ASSERT( anEntry->_appended_text.buf()[i] ); + CPPUNIT_ASSERT( expect[i] ); + CPPUNIT_ASSERT( anEntry->_appended_text[i] ); /* slight hack to make special chars visible */ - switch (anEntry->_appended_text.buf()[i]) { + switch (anEntry->_appended_text[i]) { case '\t': printf("\\t"); break; default: - printf("%c", anEntry->_appended_text.buf()[i] ); + printf("%c", anEntry->_appended_text[i] ); } /* make this an int comparison, so that we can see the ASCII code at failure */ - CPPUNIT_ASSERT_EQUAL( (int)expect.buf()[i], (int)anEntry->_appended_text.buf()[i] ); + CPPUNIT_ASSERT_EQUAL( (int)(expect[i]), (int)anEntry->_appended_text[i] ); } printf("\n"); CPPUNIT_ASSERT_EQUAL( expect, anEntry->_appended_text); === modified file 'src/tests/testStoreController.cc' --- src/tests/testStoreController.cc 2008-08-10 05:49:14 +0000 +++ src/tests/testStoreController.cc 2009-01-30 14:55:22 +0000 @@ -111,7 +111,7 @@ EBIT_CLR(e->flags, KEY_PRIVATE); e->ping_status = PING_NONE; EBIT_CLR(e->flags, ENTRY_VALIDATED); - e->hashInsert((const cache_key *)name.buf()); /* do it after we clear KEY_PRIVATE */ + e->hashInsert((const cache_key *)name.termedBuf()); /* do it after we clear KEY_PRIVATE */ return e; } === modified file 'src/tests/testStoreHashIndex.cc' --- src/tests/testStoreHashIndex.cc 2008-08-10 05:49:14 +0000 +++ src/tests/testStoreHashIndex.cc 2009-01-30 14:55:22 +0000 @@ -92,7 +92,7 @@ EBIT_CLR(e->flags, KEY_PRIVATE); e->ping_status = PING_NONE; EBIT_CLR(e->flags, ENTRY_VALIDATED); - e->hashInsert((const cache_key *)name.buf()); /* do it after we clear KEY_PRIVATE */ + e->hashInsert((const cache_key *)name.termedBuf()); /* do it after we clear KEY_PRIVATE */ return e; } === modified file 'src/url.cc' --- src/url.cc 2009-01-21 03:47:47 +0000 +++ src/url.cc 2009-02-03 17:36:15 +0000 @@ -439,7 +439,9 @@ return request->canonical; if (request->protocol == PROTO_URN) { - snprintf(urlbuf, MAX_URL, "urn:%s", request->urlpath.buf()); + snprintf(urlbuf, MAX_URL, "urn:%.*s", + request->urlpath.size(), + request->urlpath.rawBuf()); } else { /// \todo AYJ: this could use "if..else and method == METHOD_CONNECT" easier. switch (request->method.id()) { @@ -454,13 +456,14 @@ if (request->port != urlDefaultPort(request->protocol)) snprintf(portbuf, 32, ":%d", request->port); - snprintf(urlbuf, MAX_URL, "%s://%s%s%s%s%s", + snprintf(urlbuf, MAX_URL, "%s://%s%s%s%s%.*s", ProtocolStr[request->protocol], request->login, *request->login ? "@" : null_string, request->GetHost(), portbuf, - request->urlpath.buf()); + request->urlpath.size(), + request->urlpath.rawBuf()); break; } @@ -482,7 +485,8 @@ char *t; if (request->protocol == PROTO_URN) { - snprintf(buf, MAX_URL, "urn:%s", request->urlpath.buf()); + snprintf(buf, MAX_URL, "urn:%.*s", + request->urlpath.size(), request->urlpath.rawBuf()); } else { /// \todo AYJ: this could use "if..else and method == METHOD_CONNECT" easier. switch (request->method.id()) { @@ -510,12 +514,13 @@ strcat(loginbuf, "@"); } - snprintf(buf, MAX_URL, "%s://%s%s%s%s", + snprintf(buf, MAX_URL, "%s://%s%s%s%.*s", ProtocolStr[request->protocol], loginbuf, request->GetHost(), portbuf, - request->urlpath.buf()); + request->urlpath.size(), + request->urlpath.rawBuf()); /* * strip arguments AFTER a question-mark */ @@ -584,7 +589,9 @@ char *urlbuf = (char *)xmalloc(MAX_URL * sizeof(char)); if (req->protocol == PROTO_URN) { - snprintf(urlbuf, MAX_URL, "urn:%s", req->urlpath.buf()); + snprintf(urlbuf, MAX_URL, "urn:%.*s", + req->urlpath.size(), + req->urlpath.rawBuf()); return (urlbuf); } @@ -610,7 +617,7 @@ if (relUrl[0] == '/') { strncpy(&urlbuf[urllen], relUrl, MAX_URL - urllen - 1); } else { - const char *path = req->urlpath.buf(); + const char *path = req->urlpath.termedBuf(); const char *last_slash = strrchr(path, '/'); if (last_slash == NULL) { === modified file 'src/urn.cc' --- src/urn.cc 2009-01-21 03:47:47 +0000 +++ src/urn.cc 2009-02-03 17:36:15 +0000 @@ -167,26 +167,22 @@ UrnState::getHost (String &urlpath) { char * result; - char const *t; - - /* FIXME: this appears to be parsing the URL. *very* badly. */ - /* FIXME: a proper encapsulated URI/URL type needs to clear this up. */ - - if ((t = urlpath.pos(':')) != NULL) { - urlpath.set(t, '\0'); - result = xstrdup(urlpath.buf()); - urlpath.set(t, ':'); + size_t p; + + /** FIXME: this appears to be parsing the URL. *very* badly. */ + /* a proper encapsulated URI/URL type needs to clear this up. */ + if ((p=urlpath.find(':')) != std::string::npos) { + result=xstrndup(urlpath.rawBuf(),p-1); } else { - result = xstrdup(urlpath.buf()); + result = xstrndup(urlpath.rawBuf(),urlpath.size()); } - return result; } bool UrnState::RequestNeedsMenu(HttpRequest *r) { - return strncasecmp(r->urlpath.buf(), "menu.", 5) == 0; + return strncasecmp(r->urlpath.unsafeBuf(), "menu.", 5) == 0; } void @@ -202,7 +198,7 @@ { LOCAL_ARRAY(char, local_urlres, 4096); char *host = getHost (uri); - snprintf(local_urlres, 4096, "http://%s/uri-res/N2L?urn:%s", host, uri.buf()); + snprintf(local_urlres, 4096, "http://%s/uri-res/N2L?urn:%s", host, uri.unsafeBuf()); safe_free (host); safe_free (urlres); urlres = xstrdup (local_urlres); @@ -213,7 +209,7 @@ UrnState::setUriResFromRequest(HttpRequest *r) { if (RequestNeedsMenu(r)) { - updateRequestURL(r, r->urlpath.buf() + 5); + updateRequestURL(r, r->urlpath.unsafeBuf() + 5); flags.force_menu = 1; } === modified file 'src/whois.cc' --- src/whois.cc 2009-01-21 03:47:47 +0000 +++ src/whois.cc 2009-01-29 14:50:26 +0000 @@ -98,7 +98,7 @@ buf = (char *)xmalloc(l); - snprintf(buf, l, "%s\r\n", p->request->urlpath.buf() + 1); + snprintf(buf, l, "%s\r\n", p->request->urlpath.unsafeBuf() + 1); comm_write(fd, buf, strlen(buf), whoisWriteComplete, p, NULL); comm_read(fd, p->buf, BUFSIZ, whoisReadReply, p); # Begin bundle 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 A/YGA0DxP1uOfcMepIfwF3JFOFCQyN3+lQ==