Index: mozilla/netwerk/protocol/http/src/nsHttpHandler.cpp =================================================================== RCS file: /cvsroot//Volumes/src/cvs/od/CVSROOT/mozilla/netwerk/protocol/http/src/nsHttpHandler.cpp,v retrieving revision 1.122 diff -u -r1.122 mozilla/netwerk/protocol/http/src/nsHttpHandler.cpp --- mozilla/netwerk/protocol/http/src/nsHttpHandler.cpp +++ mozilla/netwerk/protocol/http/src/nsHttpHandler.cpp @@ -1107,7 +1107,7 @@ if (pls) { nsXPIDLString uval; pls->ToString(getter_Copies(uval)); - if (uval) + if (!uval.IsEmpty()) SetAcceptLanguages(NS_ConvertUTF16toUTF8(uval).get()); } } @@ -1148,31 +1148,44 @@ } /** - * Allocates a C string into that contains a ISO 639 language list - * notated with HTTP "q" values for output with a HTTP Accept-Language - * header. Previous q values will be stripped because the order of - * the langs imply the q value. The q values are calculated by dividing - * 1.0 amongst the number of languages present. + * Formats a string containing an ISO 639 language list + * notated with HTTP "q" values for output with a HTTP + * Accept-Language header. Previous q values will not be stripped + * if present. If no q values are present, then the order of langs + * will be used to calculate q values by dividing 1.0 amongst the + * number of languages present. + * + * Ex: input: "en, ja" + * output: "en,ja;q=0.5" * - * Ex: passing: "en, ja" - * returns: "en,ja;q=0.5" + * input: "en, ja, fr_CA" + * output: "en,ja;q=0.7,fr_CA;q=0.3" * - * passing: "en, ja, fr_CA" - * returns: "en,ja;q=0.7,fr_CA;q=0.3" + * input: "en-US, en-GB;q=0" + * output: "en-US, en-GB;q=0" */ static nsresult -PrepareAcceptLanguages(const char *i_AcceptLanguages, nsACString &o_AcceptLanguages) +PrepareAcceptLanguages(const nsACString &i_AcceptLanguages, nsACString &o_AcceptLanguages) { - if (!i_AcceptLanguages) - return NS_OK; - PRUint32 n, size, wrote; double q, dec; char *p, *p2, *token, *q_Accept, *o_Accept; const char *comma; PRInt32 available; - o_Accept = nsCRT::strdup(i_AcceptLanguages); + for (p = o_Accept, n = size = 0; '\0' != *p; p++) { + if (*p == ';' && + p[1] == 'q' && + p[2] == '=') + { + o_AcceptLanguages.Assign((const char *) q_Accept); + return NS_OK; + } + if (*p == ',') + n++; + size++; + } + o_Accept = nsCRT::strdup(i_AcceptLanguages.get()); if (!o_Accept) return NS_ERROR_OUT_OF_MEMORY; for (p = o_Accept, n = size = 0; '\0' != *p; p++) { @@ -1181,16 +1194,12 @@ } available = size + ++n * 11 + 1; - q_Accept = new char[available]; - if (!q_Accept) { - nsCRT::free(o_Accept); - return NS_ERROR_OUT_OF_MEMORY; - } - *q_Accept = '\0'; + o_AcceptLanguages.SetLength(available); + p2 = o_AcceptLanguages.BeginWriting(); + *p2 = '\0'; q = 1.0; dec = q / (double) n; n = 0; - p2 = q_Accept; for (token = nsCRT::strtok(o_Accept, ",", &p); token != (char *) 0; token = nsCRT::strtok(p, ",", &p)) @@ -1216,14 +1225,11 @@ } nsCRT::free(o_Accept); - o_AcceptLanguages.Assign((const char *) q_Accept); - delete [] q_Accept; - return NS_OK; } nsresult -nsHttpHandler::SetAcceptLanguages(const char *aAcceptLanguages) +nsHttpHandler::SetAcceptLanguages(const nsACString &aAcceptLanguages) { nsCAutoString buf; nsresult rv = PrepareAcceptLanguages(aAcceptLanguages, buf);