1
0
mirror of https://github.com/golang/go synced 2024-11-21 20:34:40 -07:00

http: sort header keys when writing Response or Request to wire

R=rsc
CC=golang-dev
https://golang.org/cl/203050
This commit is contained in:
Petar Maymounkov 2010-02-05 18:32:02 -08:00 committed by Russ Cox
parent ce85868a00
commit 4fdab85178
2 changed files with 24 additions and 11 deletions

View 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")

View 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)
}
}