From 8b31383627bb2d1984c759f163710e29bcf284f7 Mon Sep 17 00:00:00 2001 From: "bzbarsky@mit.edu" Date: Mon, 16 Jul 2007 21:48:47 -0700 Subject: [PATCH] Make SetPort actually update the internal offsets correctly. Bug 388281, r+sr=biesi --- netwerk/base/src/nsStandardURL.cpp | 13 +++++++++---- netwerk/test/unit/test_bug388281.js | 27 +++++++++++++++++++++++++++ 2 files changed, 36 insertions(+), 4 deletions(-) create mode 100644 netwerk/test/unit/test_bug388281.js diff --git a/netwerk/base/src/nsStandardURL.cpp b/netwerk/base/src/nsStandardURL.cpp index 9f311a197724..02a82a2f0627 100644 --- a/netwerk/base/src/nsStandardURL.cpp +++ b/netwerk/base/src/nsStandardURL.cpp @@ -1511,13 +1511,16 @@ nsStandardURL::SetPort(PRInt32 port) buf.Assign(':'); buf.AppendInt(port); mSpec.Insert(buf, mHost.mPos + mHost.mLen); + mAuthority.mLen += buf.Length(); ShiftFromPath(buf.Length()); } - else if (port == -1) { + else if (port == -1 || port == mDefaultPort) { // need to remove the port number from the URL spec PRUint32 start = mHost.mPos + mHost.mLen; - mSpec.Cut(start, mPath.mPos - start); - ShiftFromPath(start - mPath.mPos); + PRUint32 lengthToCut = mPath.mPos - start; + mSpec.Cut(start, lengthToCut); + mAuthority.mLen -= lengthToCut; + ShiftFromPath(-lengthToCut); } else { // need to replace the existing port @@ -1526,8 +1529,10 @@ nsStandardURL::SetPort(PRInt32 port) PRUint32 start = mHost.mPos + mHost.mLen + 1; PRUint32 length = mPath.mPos - start; mSpec.Replace(start, length, buf); - if (buf.Length() != length) + if (buf.Length() != length) { + mAuthority.mLen += buf.Length() - length; ShiftFromPath(buf.Length() - length); + } } mPort = port; diff --git a/netwerk/test/unit/test_bug388281.js b/netwerk/test/unit/test_bug388281.js new file mode 100644 index 000000000000..0790cb9d7a48 --- /dev/null +++ b/netwerk/test/unit/test_bug388281.js @@ -0,0 +1,27 @@ +const Cc = Components.classes; +const Ci = Components.interfaces; + +function run_test() { + const ios = Cc["@mozilla.org/network/io-service;1"]. + getService(Ci.nsIIOService); + + var uri = ios.newURI("http://foo.com/file.txt", null, null); + uri.port = 90; + do_check_eq(uri.hostPort, "foo.com:90"); + + uri = ios.newURI("http://foo.com:10/file.txt", null, null); + uri.port = 500; + do_check_eq(uri.hostPort, "foo.com:500"); + + uri = ios.newURI("http://foo.com:5000/file.txt", null, null); + uri.port = 20; + do_check_eq(uri.hostPort, "foo.com:20"); + + uri = ios.newURI("http://foo.com:5000/file.txt", null, null); + uri.port = -1; + do_check_eq(uri.hostPort, "foo.com"); + + uri = ios.newURI("http://foo.com:5000/file.txt", null, null); + uri.port = 80; + do_check_eq(uri.hostPort, "foo.com"); +}