http: use Header.Del not empty Set(k, "")

Also don't serialize empty headers.

R=dsymonds, rsc
CC=golang-dev
https://golang.org/cl/4275045
diff --git a/src/pkg/http/response.go b/src/pkg/http/response.go
index 7ac7fb8..1f725ec 100644
--- a/src/pkg/http/response.go
+++ b/src/pkg/http/response.go
@@ -224,9 +224,12 @@
 	sort.SortStrings(keys)
 	for _, k := range keys {
 		for _, v := range h[k] {
-			v = strings.TrimSpace(v)
 			v = strings.Replace(v, "\n", " ", -1)
 			v = strings.Replace(v, "\r", " ", -1)
+			v = strings.TrimSpace(v)
+			if v == "" {
+				continue
+			}
 			if _, err := fmt.Fprintf(w, "%s: %s\r\n", k, v); err != nil {
 				return err
 			}
diff --git a/src/pkg/http/serve_test.go b/src/pkg/http/serve_test.go
index 482acfd..6b881a2 100644
--- a/src/pkg/http/serve_test.go
+++ b/src/pkg/http/serve_test.go
@@ -15,6 +15,7 @@
 	"io/ioutil"
 	"os"
 	"net"
+	"reflect"
 	"strings"
 	"testing"
 	"time"
@@ -427,3 +428,25 @@
 		t.Fatalf("Expected local addr; got %q", ip)
 	}
 }
+
+func TestChunkedResponseHeaders(t *testing.T) {
+	ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
+		w.Header().Set("Content-Length", "intentional gibberish") // we check that this is deleted
+		fmt.Fprintf(w, "I am a chunked response.")
+	}))
+	defer ts.Close()
+
+	res, _, err := Get(ts.URL)
+	if err != nil {
+		t.Fatalf("Get error: %v", err)
+	}
+	if g, e := res.ContentLength, int64(-1); g != e {
+		t.Errorf("expected ContentLength of %d; got %d", e, g)
+	}
+	if g, e := res.TransferEncoding, []string{"chunked"}; !reflect.DeepEqual(g, e) {
+		t.Errorf("expected TransferEncoding of %v; got %v", e, g)
+	}
+	if _, haveCL := res.Header["Content-Length"]; haveCL {
+		t.Errorf("Unexpected Content-Length")
+	}
+}
diff --git a/src/pkg/http/server.go b/src/pkg/http/server.go
index 6a7c74e..91caebc 100644
--- a/src/pkg/http/server.go
+++ b/src/pkg/http/server.go
@@ -236,7 +236,7 @@
 			hasCL = true
 		} else {
 			log.Printf("http: invalid Content-Length of %q sent", clenStr)
-			w.header.Set("Content-Length", "")
+			w.header.Del("Content-Length")
 		}
 	}
 
@@ -247,7 +247,7 @@
 		// For now just ignore the Content-Length.
 		log.Printf("http: WriteHeader called with both Transfer-Encoding of %q and a Content-Length of %d",
 			te, contentLength)
-		w.header.Set("Content-Length", "")
+		w.header.Del("Content-Length")
 		hasCL = false
 	}
 
@@ -286,7 +286,7 @@
 
 	// Cannot use Content-Length with non-identity Transfer-Encoding.
 	if w.chunking {
-		w.header.Set("Content-Length", "")
+		w.header.Del("Content-Length")
 	}
 	if !w.req.ProtoAtLeast(1, 0) {
 		return