]> Cypherpunks repositories - gostls13.git/commitdiff
http: sort header keys when writing Response or Request to wire
authorPetar Maymounkov <petarm@gmail.com>
Sat, 6 Feb 2010 02:32:02 +0000 (18:32 -0800)
committerRuss Cox <rsc@golang.org>
Sat, 6 Feb 2010 02:32:02 +0000 (18:32 -0800)
R=rsc
CC=golang-dev
https://golang.org/cl/203050

src/pkg/http/request.go
src/pkg/http/response.go

index 0c8748586759bfa624f51da6730f0775a4bb73b1..17afc9cc1b0923c7a7ab29eba2b34f643de11d53 100644 (file)
@@ -49,6 +49,8 @@ type badStringError struct {
 
 func (e *badStringError) String() string { return fmt.Sprintf("%s %q", e.what, e.str) }
 
+var reqExcludeHeader = map[string]int{"Host": 0, "User-Agent": 0, "Referer": 0}
+
 // A Request represents a parsed HTTP request header.
 type Request struct {
        Method     string // GET, POST, PUT, etc.
@@ -169,14 +171,7 @@ func (req *Request) Write(w io.Writer) os.Error {
        // from Request, and introduce Request methods along the lines of
        // Response.{GetHeader,AddHeader} and string constants for "Host",
        // "User-Agent" and "Referer".
-       for k, v := range req.Header {
-               // Host, User-Agent, and Referer were sent from structure fields
-               // above; ignore them if they also appear in req.Header.
-               if k == "Host" || k == "User-Agent" || k == "Referer" {
-                       continue
-               }
-               io.WriteString(w, k+": "+v+"\r\n")
-       }
+       writeSortedKeyValue(w, req.Header, reqExcludeHeader)
 
        io.WriteString(w, "\r\n")
 
index ba7e95ee28e9120174f665f6a183eb2adfec6431..30f8934917e0c6a45fbf05ec7b02cfc769237199 100644 (file)
@@ -8,12 +8,16 @@ package http
 
 import (
        "bufio"
+       "fmt"
        "io"
        "os"
+       "sort"
        "strconv"
        "strings"
 )
 
+var respExcludeHeader = map[string]int{}
+
 // Response represents the response from an HTTP request.
 //
 type Response struct {
@@ -455,9 +459,7 @@ func (resp *Response) Write(w io.Writer) os.Error {
        }
 
        // Rest of header
-       for k, v := range resp.Header {
-               io.WriteString(w, k+": "+v+"\r\n")
-       }
+       writeSortedKeyValue(w, resp.Header, respExcludeHeader)
 
        // End-of-header
        io.WriteString(w, "\r\n")
@@ -491,3 +493,19 @@ func (resp *Response) Write(w io.Writer) os.Error {
        // Success
        return nil
 }
+
+func writeSortedKeyValue(w io.Writer, kvm map[string]string, exclude map[string]int) {
+       kva := make([]string, len(kvm))
+       i := 0
+       for k, v := range kvm {
+               if _, exc := exclude[k]; !exc {
+                       kva[i] = fmt.Sprint(k + ": " + v + "\r\n")
+                       i++
+               }
+       }
+       kva = kva[0:i]
+       sort.SortStrings(kva)
+       for _, l := range kva {
+               io.WriteString(w, l)
+       }
+}