diff options
author | Petar Maymounkov <petarm@gmail.com> | 2010-02-05 18:32:02 -0800 |
---|---|---|
committer | Petar Maymounkov <petarm@gmail.com> | 2010-02-05 18:32:02 -0800 |
commit | e9a99e594a08526d8ebb1e0ef083c93831b16a6f (patch) | |
tree | c901e1545a0f13aaedf59d05c2e664791f9f78c7 | |
parent | 180da78b10b84d4923a8430a0ec130502dca05ee (diff) | |
download | golang-e9a99e594a08526d8ebb1e0ef083c93831b16a6f.tar.gz |
http: sort header keys when writing Response or Request to wire
R=rsc
CC=golang-dev
http://codereview.appspot.com/203050
Committer: Russ Cox <rsc@golang.org>
-rw-r--r-- | src/pkg/http/request.go | 11 | ||||
-rw-r--r-- | src/pkg/http/response.go | 24 |
2 files changed, 24 insertions, 11 deletions
diff --git a/src/pkg/http/request.go b/src/pkg/http/request.go index 0c8748586..17afc9cc1 100644 --- a/src/pkg/http/request.go +++ b/src/pkg/http/request.go @@ -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") diff --git a/src/pkg/http/response.go b/src/pkg/http/response.go index ba7e95ee2..30f893491 100644 --- a/src/pkg/http/response.go +++ b/src/pkg/http/response.go @@ -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) + } +} |