Bug 90530, make it possible to set content-type header. Patch from garths@oeone.com. r=heikki, sr=jst.

This commit is contained in:
heikki%netscape.com 2006-04-20 03:37:28 +00:00
Родитель d4f565ccd1
Коммит 41091979e8
1 изменённых файлов: 20 добавлений и 19 удалений

Просмотреть файл

@ -782,39 +782,40 @@ nsXMLHttpRequest::GetStreamForWString(const PRUnichar* aStr,
rv = encoder->GetMaxLength(unicodeBuf, unicodeLength, &charLength);
if (NS_FAILED(rv)) return NS_ERROR_FAILURE;
#define MAX_HEADER_SIZE 128
// Allocate extra space for the header and trailing CRLF
postData = (char*)nsMemory::Alloc(MAX_HEADER_SIZE + charLength + 3);
// Allocate extra space for the trailing and leading CRLF
postData = (char*)nsMemory::Alloc(charLength + 5);
if (!postData) {
return NS_ERROR_OUT_OF_MEMORY;
}
rv = encoder->Convert(unicodeBuf,
&unicodeLength, postData+MAX_HEADER_SIZE, &charLength);
&unicodeLength, postData+2, &charLength);
if (NS_FAILED(rv)) {
nsMemory::Free(postData);
return NS_ERROR_FAILURE;
}
// Now that we know the real content length we can create the header
PR_snprintf(postData,
MAX_HEADER_SIZE,
"Content-type: text/xml\015\012Content-Length: %d\015\012\015\012",
charLength);
PRInt32 headerSize = nsCRT::strlen(postData);
// If no content type header was set by the client, we set it to text/xml.
nsXPIDLCString header;
if( NS_OK != mChannel->GetRequestHeader("Content-Type", getter_Copies(header)) )
mChannel->SetRequestHeader("Content-Type", "text/xml" );
// Copy the post data to immediately follow the header
nsCRT::memcpy(postData+headerSize, postData+MAX_HEADER_SIZE, charLength);
// set the content length header
char charLengthBuf [32];
PR_snprintf(charLengthBuf, sizeof(charLengthBuf), "%d", charLength);
mChannel->SetRequestHeader("Content-Length", charLengthBuf );
// Shove in the trailing CRLF
postData[headerSize+charLength] = nsCRT::CR;
postData[headerSize+charLength+1] = nsCRT::LF;
postData[headerSize+charLength+2] = '\0';
// Shove in the trailing and leading CRLF
postData[0] = nsCRT::CR;
postData[1] = nsCRT::LF;
postData[2+charLength] = nsCRT::CR;
postData[2+charLength+1] = nsCRT::LF;
postData[2+charLength+2] = '\0';
// The new stream takes ownership of the buffer
rv = NS_NewByteArrayInputStream((nsIByteArrayInputStream**)aStream,
postData,
headerSize+charLength+2);
charLength+4);
if (NS_FAILED(rv)) {
nsMemory::Free(postData);
return NS_ERROR_FAILURE;