Index: mozilla/content/base/src/nsXMLHttpRequest.cpp =================================================================== RCS file: /cvsroot/mozilla/content/base/src/nsXMLHttpRequest.cpp,v retrieving revision 1.159 diff -pu -r1.159 mozilla/content/base/src/nsXMLHttpRequest.cpp --- mozilla/content/base/src/nsXMLHttpRequest.cpp +++ mozilla/content/base/src/nsXMLHttpRequest.cpp @@ -1533,16 +1533,39 @@ nsXMLHttpRequest::Send(nsIVariant *aBody if (serial) { // Convert to a byte stream - nsCOMPtr converter = - do_CreateInstance("@mozilla.org/intl/scriptableunicodeconverter", &rv); - NS_ENSURE_SUCCESS(rv, rv); - - rv = converter->SetCharset("UTF-8"); - NS_ENSURE_SUCCESS(rv, rv); - - rv = converter->ConvertToInputStream(serial, - getter_AddRefs(postDataStream)); - NS_ENSURE_SUCCESS(rv, rv); + nsCOMPtr ccm = + do_GetService(NS_CHARSETCONVERTERMANAGER_CONTRACTID, &rv); + if (NS_FAILED(rv)) + return rv; + + nsCOMPtr encoder; + rv = ccm->GetUnicodeEncoderRaw("UTF-8", + getter_AddRefs(encoder)); + if (NS_FAILED(rv)) + return rv; + + PRInt32 srcLength = serial.Length(); + PRInt32 outLength = srcLength*6; + if (outLength < srcLength) + return NS_ERROR_FAILURE; + + char *output = (char*)NS_Alloc(outLength); + if (!output) + return NS_ERROR_OUT_OF_MEMORY; + + rv = encoder->Convert(serial.get(), &srcLength, output, &outLength); + if (NS_SUCCEEDED(rv)) { + nsCOMPtr stringDataStream = + do_CreateInstance(NS_STRINGINPUTSTREAM_CONTRACTID, &rv); + postDataStream = stringDataStream; + if (postDataStream) { + rv = stringDataStream->SetData(output, outLength); + } + } + NS_Free(output); + + if (NS_FAILED(rv)) + return rv; } if (postDataStream) {