void CHttpController::ProcessResponseHeadersL( RHTTPTransaction& aTransaction ) { CheckStatusCodeL( aTransaction ); ParseHeadersL( aTransaction ); if ( !iOutputStream ) { delete iResponseData; iResponseData = NULL; TInt len = ContentLength( aTransaction.Response().GetHeaderCollection(), iSession ); iResponseData = HBufC8::NewL( len > 0 ? len : KMaxMemoryBuffer ); } StartTimeout(); }
int64_t nsHttpResponseHead::TotalEntitySize() const { const char* contentRange = PeekHeader(nsHttp::Content_Range); if (!contentRange) return ContentLength(); // Total length is after a slash const char* slash = strrchr(contentRange, '/'); if (!slash) return -1; // No idea what the length is slash++; if (*slash == '*') // Server doesn't know the length return -1; int64_t size; if (!nsHttp::ParseInt64(slash, &size)) size = UINT64_MAX; return size; }
nsresult nsDataChannel::OpenContentStream(PRBool async, nsIInputStream **result, nsIChannel** channel) { NS_ENSURE_TRUE(URI(), NS_ERROR_NOT_INITIALIZED); nsresult rv; nsCAutoString spec; rv = URI()->GetAsciiSpec(spec); if (NS_FAILED(rv)) return rv; nsCString contentType, contentCharset, dataBuffer; PRBool lBase64; rv = nsDataHandler::ParseURI(spec, contentType, contentCharset, lBase64, dataBuffer); NS_UnescapeURL(dataBuffer); if (lBase64) { // Don't allow spaces in base64-encoded content. This is only // relevant for escaped spaces; other spaces are stripped in // NewURI. dataBuffer.StripWhitespace(); } nsCOMPtr<nsIInputStream> bufInStream; nsCOMPtr<nsIOutputStream> bufOutStream; // create an unbounded pipe. rv = NS_NewPipe(getter_AddRefs(bufInStream), getter_AddRefs(bufOutStream), nsIOService::gDefaultSegmentSize, PR_UINT32_MAX, async, PR_TRUE); if (NS_FAILED(rv)) return rv; PRUint32 contentLen; if (lBase64) { const PRUint32 dataLen = dataBuffer.Length(); PRInt32 resultLen = 0; if (dataLen >= 1 && dataBuffer[dataLen-1] == '=') { if (dataLen >= 2 && dataBuffer[dataLen-2] == '=') resultLen = dataLen-2; else resultLen = dataLen-1; } else { resultLen = dataLen; } resultLen = ((resultLen * 3) / 4); // XXX PL_Base64Decode will return a null pointer for decoding // errors. Since those are more likely than out-of-memory, // should we return NS_ERROR_MALFORMED_URI instead? char * decodedData = PL_Base64Decode(dataBuffer.get(), dataLen, nsnull); if (!decodedData) { return NS_ERROR_OUT_OF_MEMORY; } rv = bufOutStream->Write(decodedData, resultLen, &contentLen); PR_Free(decodedData); } else { rv = bufOutStream->Write(dataBuffer.get(), dataBuffer.Length(), &contentLen); } if (NS_FAILED(rv)) return rv; SetContentType(contentType); SetContentCharset(contentCharset); ContentLength() = contentLen; NS_ADDREF(*result = bufInStream); return NS_OK; }