Bug 667907. For HTTP 0.9 on non-default ports, be more conservative. r=jduell, a=legneato
--- 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();
+}