void nsHttpResponseHead::ParseStatusLine(const char *line) { // // Parse Status-Line:: HTTP-Version SP Status-Code SP Reason-Phrase CRLF // // HTTP-Version ParseVersion(line); if ((mVersion == NS_HTTP_VERSION_0_9) || !(line = PL_strchr(line, ' '))) { mStatus = 200; mStatusText.AssignLiteral("OK"); } else { // Status-Code mStatus = (PRUint16) atoi(++line); if (mStatus == 0) { LOG(("mal-formed response status; assuming status = 200\n")); mStatus = 200; } // Reason-Phrase is whatever is remaining of the line if (!(line = PL_strchr(line, ' '))) { LOG(("mal-formed response status line; assuming statusText = 'OK'\n")); mStatusText.AssignLiteral("OK"); } else mStatusText = ++line; } LOG(("Have status line [version=%u status=%u statusText=%s]\n", PRUintn(mVersion), PRUintn(mStatus), mStatusText.get())); }
nsAutoLockBase::nsAutoLockBase(void* addr, nsAutoLockType type) { if (LockStackTPI == PRUintn(-1)) InitAutoLockStatics(); nsAutoLockBase* stackTop = (nsAutoLockBase*) PR_GetThreadPrivate(LockStackTPI); if (stackTop) { if (stackTop->mAddr == addr) { // Ignore reentry: it's legal for monitors, and NSPR will assert // if you reenter a PRLock. } else if (!addr) { // Ignore null addresses: the caller promises not to use the // lock at all, and NSPR will assert if you enter it. } else { const void* node = #ifdef NS_TRACE_MALLOC_XXX NS_GetStackTrace(1) #else nsnull #endif ; nsNamedVector* vec1; nsNamedVector* vec2; PRUint32 i2; if (!WellOrdered(stackTop->mAddr, addr, node, &i2, &vec1, &vec2)) { char buf[128]; PR_snprintf(buf, sizeof buf, "Potential deadlock between %s%s@%p and %s%s@%p", vec1->mName ? vec1->mName : "", LockTypeNames[stackTop->mType], stackTop->mAddr, vec2->mName ? vec2->mName : "", LockTypeNames[type], addr); #ifdef NS_TRACE_MALLOC_XXX fprintf(stderr, "\n*** %s\n\nCurrent stack:\n", buf); NS_DumpStackTrace(node, stderr); fputs("\nPrevious stack:\n", stderr); NS_DumpStackTrace(vec2->mInnerSites.ElementAt(i2), stderr); putc('\n', stderr); #endif NS_ERROR(buf); } } } mAddr = addr; mDown = stackTop; mType = type; if (mAddr) (void) PR_SetThreadPrivate(LockStackTPI, this); }
void nsHttpResponseHead::Flatten(nsACString &buf, PRBool pruneTransients) { if (mVersion == NS_HTTP_VERSION_0_9) return; buf.AppendLiteral("HTTP/"); if (mVersion == NS_HTTP_VERSION_1_1) buf.AppendLiteral("1.1 "); else buf.AppendLiteral("1.0 "); buf.Append(nsPrintfCString("%u", PRUintn(mStatus)) + NS_LITERAL_CSTRING(" ") + mStatusText + NS_LITERAL_CSTRING("\r\n")); if (!pruneTransients) { mHeaders.Flatten(buf, PR_FALSE); return; } // otherwise, we need to iterate over the headers and only flatten // those that are appropriate. PRUint32 i, count = mHeaders.Count(); for (i=0; i<count; ++i) { nsHttpAtom header; const char *value = mHeaders.PeekHeaderAt(i, header); if (!value || header == nsHttp::Connection || header == nsHttp::Proxy_Connection || header == nsHttp::Keep_Alive || header == nsHttp::WWW_Authenticate || header == nsHttp::Proxy_Authenticate || header == nsHttp::Trailer || header == nsHttp::Transfer_Encoding || header == nsHttp::Upgrade // XXX this will cause problems when we start honoring // Cache-Control: no-cache="set-cookie", what to do? || header == nsHttp::Set_Cookie) continue; // otherwise, write out the "header: value\r\n" line buf.Append(nsDependentCString(header.get()) + NS_LITERAL_CSTRING(": ") + nsDependentCString(value) + NS_LITERAL_CSTRING("\r\n")); } }