Bug 667907. For HTTP 0.9 on non-default ports, be more conservative. r=jduell, a=legneato CAMINO_2_1_MINIBRANCH
authorBoris Zbarsky <bzbarsky@mit.edu>
Thu, 07 Jul 2011 14:17:13 -0400
branchCAMINO_2_1_MINIBRANCH
changeset 35221 4db27b0213d852d7187f2e2647367fdaf09c9066
parent 35220 d29075663ed5974e4b56aa1b9b1a57f8ddf01147
child 35222 1169f4d058e8e345f3fca89d0e89d746770f5794
push id1998
push useralqahira@ardisson.org
push dateThu, 03 Nov 2011 02:27:52 +0000
reviewersjduell, legneato
bugs667907
milestone1.9.2.23
Bug 667907. For HTTP 0.9 on non-default ports, be more conservative. r=jduell, a=legneato
netwerk/protocol/http/src/nsHttpChannel.cpp
netwerk/test/unit/test_bug667907.js
--- a/netwerk/protocol/http/src/nsHttpChannel.cpp
+++ b/netwerk/protocol/http/src/nsHttpChannel.cpp
@@ -785,18 +785,22 @@ CallTypeSniffers(void *aClosure, const P
 }
 
 nsresult
 nsHttpChannel::CallOnStartRequest()
 {
     mTracingEnabled = PR_FALSE;
 
     if (mResponseHead && mResponseHead->ContentType().IsEmpty()) {
+        NS_ASSERTION(mConnectionInfo, "Should have connection info here");
         if (!mContentTypeHint.IsEmpty())
             mResponseHead->SetContentType(mContentTypeHint);
+        else if (mResponseHead->Version() == NS_HTTP_VERSION_0_9 &&
+                 mConnectionInfo->Port() != mConnectionInfo->DefaultPort())
+            mResponseHead->SetContentType(NS_LITERAL_CSTRING(TEXT_PLAIN));
         else {
             // Uh-oh.  We had better find out what type we are!
 
             // XXX This does not work with content-encodings...  but
             // neither does applying the conversion from the URILoader
 
             nsCOMPtr<nsIStreamConverterService> serv;
             nsresult rv = gHttpHandler->
new file mode 100644
--- /dev/null
+++ b/netwerk/test/unit/test_bug667907.js
@@ -0,0 +1,81 @@
+do_load_httpd_js();
+
+var httpserver = null;
+var simplePath = "/simple";
+var normalPath = "/normal";
+var httpbody = "<html></html>";
+var uri1 = "http://localhost:4444" + simplePath;
+var uri2 = "http://localhost:4444" + normalPath;
+
+function make_channel(url) {
+  var ios = Cc["@mozilla.org/network/io-service;1"].
+            getService(Ci.nsIIOService);
+  return ios.newChannel(url, "", null);
+}
+
+var listener_proto = {
+  QueryInterface: function(iid) {
+    if (iid.equals(Components.interfaces.nsIStreamListener) ||
+        iid.equals(Components.interfaces.nsIRequestObserver) ||
+        iid.equals(Components.interfaces.nsISupports))
+      return this;
+    throw Components.results.NS_ERROR_NO_INTERFACE;
+  },
+
+  onStartRequest: function(request, context) {
+    do_check_eq(request.QueryInterface(Ci.nsIChannel).contentType,
+		this.contentType);
+    request.cancel(Cr.NS_BINDING_ABORTED);
+  },
+
+  onDataAvailable: function(request, context, stream, offset, count) {
+    do_throw("Unexpected onDataAvailable");
+  },
+
+  onStopRequest: function(request, context, status) {
+    do_check_eq(status, Cr.NS_BINDING_ABORTED);
+    this.termination_func();
+  }  
+};
+
+function listener(contentType, termination_func) {
+  this.contentType = contentType;
+  this.termination_func = termination_func;
+}
+listener.prototype = listener_proto;
+
+function run_test()
+{
+  httpserver = new nsHttpServer();
+  httpserver.registerPathHandler(simplePath, simpleHandler);
+  httpserver.registerPathHandler(normalPath, normalHandler);
+  httpserver.start(4444);
+  
+  var channel = make_channel(uri1);
+  channel.asyncOpen(new listener("text/plain", function() {
+	run_test2();
+      }), null);
+
+  do_test_pending();
+}
+
+function run_test2()
+{
+  var channel = make_channel(uri2);
+  channel.asyncOpen(new listener("text/html", function() {
+	httpserver.stop(do_test_finished);
+      }), null);
+}
+
+function simpleHandler(metadata, response)
+{
+  response.seizePower();
+  response.bodyOutputStream.write(httpbody, httpbody.length);
+  response.finish();
+}
+
+function normalHandler(metadata, response)
+{
+  response.bodyOutputStream.write(httpbody, httpbody.length);
+  response.finish();
+}