void UPPayHttpConnection::AddHeaderL(RHTTPHeaders aHeaders, TInt aHeaderField, const TDesC8& aHeaderValue) { RStringPool stringPool = iSession.StringPool(); RStringF valStr = stringPool.OpenFStringL(aHeaderValue); THTTPHdrVal headerVal(valStr); aHeaders.SetFieldL(stringPool.StringF(aHeaderField, RHTTPSession::GetTable()), headerVal); valStr.Close(); }
nsresult nsMultiMixedConv::ParseHeaders(nsIChannel *aChannel, char *&aPtr, uint32_t &aLen, bool *_retval) { // NOTE: this data must be ascii. // NOTE: aPtr is NOT null terminated! nsresult rv = NS_OK; char *cursor = aPtr, *newLine = nullptr; uint32_t cursorLen = aLen; bool done = false; uint32_t lineFeedIncrement = 1; // We only create an nsHttpResponseHead for packaged app channels // It may already be initialized, from a previous call of ParseHeaders // since the headers for a single part may come in more then one chunk if (mPackagedApp && !mResponseHead) { mResponseHead = new nsHttpResponseHead(); } mContentLength = UINT64_MAX; // XXX what if we were already called? while (cursorLen && (newLine = (char *) memchr(cursor, nsCRT::LF, cursorLen))) { // adjust for linefeeds if ((newLine > cursor) && (newLine[-1] == nsCRT::CR) ) { // CRLF lineFeedIncrement = 2; newLine--; } else lineFeedIncrement = 1; // reset if (newLine == cursor) { // move the newLine beyond the linefeed marker NS_ASSERTION(cursorLen >= lineFeedIncrement, "oops!"); cursor += lineFeedIncrement; cursorLen -= lineFeedIncrement; done = true; break; } char tmpChar = *newLine; *newLine = '\0'; // cursor is now null terminated if (mResponseHead) { // ParseHeaderLine is destructive. We create a copy nsAutoCString tmpHeader(cursor); mResponseHead->ParseHeaderLine(tmpHeader.get()); } char *colon = (char *) strchr(cursor, ':'); if (colon) { *colon = '\0'; nsAutoCString headerStr(cursor); headerStr.CompressWhitespace(); *colon = ':'; nsAutoCString headerVal(colon + 1); headerVal.CompressWhitespace(); // examine header if (headerStr.LowerCaseEqualsLiteral("content-type")) { mContentType = headerVal; } else if (headerStr.LowerCaseEqualsLiteral("content-length")) { mContentLength = nsCRT::atoll(headerVal.get()); } else if (headerStr.LowerCaseEqualsLiteral("content-disposition")) { mContentDisposition = headerVal; } else if (headerStr.LowerCaseEqualsLiteral("set-cookie")) { nsCOMPtr<nsIHttpChannelInternal> httpInternal = do_QueryInterface(aChannel); if (httpInternal) { httpInternal->SetCookie(headerVal.get()); } } else if (headerStr.LowerCaseEqualsLiteral("content-range") || headerStr.LowerCaseEqualsLiteral("range") ) { // something like: Content-range: bytes 7000-7999/8000 char* tmpPtr; tmpPtr = (char *) strchr(colon + 1, '/'); if (tmpPtr) *tmpPtr = '\0'; // pass the bytes-unit and the SP char *range = (char *) strchr(colon + 2, ' '); if (!range) return NS_ERROR_FAILURE; do { range++; } while (*range == ' '); if (range[0] == '*'){ mByteRangeStart = mByteRangeEnd = 0; } else { tmpPtr = (char *) strchr(range, '-'); if (!tmpPtr) return NS_ERROR_FAILURE; tmpPtr[0] = '\0'; mByteRangeStart = nsCRT::atoll(range); tmpPtr++; mByteRangeEnd = nsCRT::atoll(tmpPtr); } mIsByteRangeRequest = true; if (mContentLength == UINT64_MAX) mContentLength = uint64_t(mByteRangeEnd - mByteRangeStart + 1); } } *newLine = tmpChar; newLine += lineFeedIncrement; cursorLen -= (newLine - cursor); cursor = newLine; } aPtr = cursor; aLen = cursorLen; *_retval = done; return rv; }