summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPetar Maymounkov <petarm@gmail.com>2010-02-05 18:32:02 -0800
committerPetar Maymounkov <petarm@gmail.com>2010-02-05 18:32:02 -0800
commite9a99e594a08526d8ebb1e0ef083c93831b16a6f (patch)
treec901e1545a0f13aaedf59d05c2e664791f9f78c7
parent180da78b10b84d4923a8430a0ec130502dca05ee (diff)
downloadgolang-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.go11
-rw-r--r--src/pkg/http/response.go24
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)
+ }
+}