1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
|
Index: netwerk/base/src/nsStandardURL.cpp
===================================================================
RCS file: /cvs/mozilla/netwerk/base/src/nsStandardURL.cpp,v
retrieving revision 1.60.16.2
diff -p -u -1 -2 -r1.60.16.2 nsStandardURL.cpp
--- netwerk/base/src/nsStandardURL.cpp 17 Feb 2005 23:40:53 -0000 1.60.16.2
+++ netwerk/base/src/nsStandardURL.cpp 9 Sep 2005 16:34:46 -0000
@@ -403,24 +403,25 @@ nsStandardURL::AppendToBuf(char *buf, PR
// 4- update url segment positions and lengths
nsresult
nsStandardURL::BuildNormalizedSpec(const char *spec)
{
// Assumptions: all member URLSegments must be relative the |spec| argument
// passed to this function.
// buffers for holding escaped url segments (these will remain empty unless
// escaping is required).
nsCAutoString encUsername;
nsCAutoString encPassword;
nsCAutoString encHost;
+ PRBool useEncHost;
nsCAutoString encDirectory;
nsCAutoString encBasename;
nsCAutoString encExtension;
nsCAutoString encParam;
nsCAutoString encQuery;
nsCAutoString encRef;
//
// escape each URL segment, if necessary, and calculate approximate normalized
// spec length.
//
PRInt32 approxLen = 3; // includes room for "://"
@@ -440,34 +441,36 @@ nsStandardURL::BuildNormalizedSpec(const
approxLen += encoder.EncodeSegmentCount(spec, mBasename, esc_FileBaseName, encBasename);
approxLen += encoder.EncodeSegmentCount(spec, mExtension, esc_FileExtension, encExtension);
approxLen += encoder.EncodeSegmentCount(spec, mParam, esc_Param, encParam);
approxLen += encoder.EncodeSegmentCount(spec, mQuery, esc_Query, encQuery);
approxLen += encoder.EncodeSegmentCount(spec, mRef, esc_Ref, encRef);
}
// do not escape the hostname, if IPv6 address literal, mHost will
// already point to a [ ] delimited IPv6 address literal.
// However, perform Unicode normalization on it, as IDN does.
mHostEncoding = eEncoding_ASCII;
if (mHost.mLen > 0) {
+ useEncHost = PR_FALSE;
const nsCSubstring& tempHost =
Substring(spec + mHost.mPos, spec + mHost.mPos + mHost.mLen);
if (IsASCII(tempHost))
approxLen += mHost.mLen;
else {
mHostEncoding = eEncoding_UTF8;
if (gIDNService &&
- NS_SUCCEEDED(gIDNService->Normalize(tempHost, encHost)))
+ NS_SUCCEEDED(gIDNService->Normalize(tempHost, encHost))) {
approxLen += encHost.Length();
- else {
+ useEncHost = PR_TRUE;
+ } else {
encHost.Truncate();
approxLen += mHost.mLen;
}
}
}
//
// generate the normalized URL string
//
mSpec.SetLength(approxLen + 32);
char *buf;
mSpec.BeginWriting(buf);
@@ -483,25 +486,30 @@ nsStandardURL::BuildNormalizedSpec(const
mAuthority.mPos = i;
// append authority
if (mUsername.mLen > 0) {
i = AppendSegmentToBuf(buf, i, spec, mUsername, &encUsername);
if (mPassword.mLen >= 0) {
buf[i++] = ':';
i = AppendSegmentToBuf(buf, i, spec, mPassword, &encPassword);
}
buf[i++] = '@';
}
if (mHost.mLen > 0) {
- i = AppendSegmentToBuf(buf, i, spec, mHost, &encHost);
+ if (useEncHost) {
+ mHost.mPos = i;
+ mHost.mLen = encHost.Length();
+ i = AppendToBuf(buf, i, encHost.get(), mHost.mLen);
+ } else
+ i = AppendSegmentToBuf(buf, i, spec, mHost);
net_ToLowerCase(buf + mHost.mPos, mHost.mLen);
if (mPort != -1 && mPort != mDefaultPort) {
nsCAutoString portbuf;
portbuf.AppendInt(mPort);
buf[i++] = ':';
i = AppendToBuf(buf, i, portbuf.get(), portbuf.Length());
}
}
// record authority length
mAuthority.mLen = i - mAuthority.mPos;
|