summaryrefslogtreecommitdiff
path: root/src/pkg/http
diff options
context:
space:
mode:
Diffstat (limited to 'src/pkg/http')
-rw-r--r--src/pkg/http/request.go53
-rw-r--r--src/pkg/http/response.go17
-rw-r--r--src/pkg/http/transfer.go7
3 files changed, 30 insertions, 47 deletions
diff --git a/src/pkg/http/request.go b/src/pkg/http/request.go
index 33c12c024..83a335bec 100644
--- a/src/pkg/http/request.go
+++ b/src/pkg/http/request.go
@@ -49,13 +49,13 @@ 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,
- "Content-Length": 0,
- "Transfer-Encoding": 0,
- "Trailer": 0,
+var reqExcludeHeader = map[string]bool{
+ "Host": true,
+ "User-Agent": true,
+ "Referer": true,
+ "Content-Length": true,
+ "Transfer-Encoding": true,
+ "Trailer": true,
}
// A Request represents a parsed HTTP request header.
@@ -518,24 +518,19 @@ func ReadRequest(b *bufio.Reader) (req *Request, err os.Error) {
// Host: doesntmatter
// the same. In the second case, any Host line is ignored.
req.Host = req.URL.Host
- if v, present := req.Header["Host"]; present {
- if req.Host == "" {
- req.Host = v
- }
- req.Header["Host"] = "", false
+ if req.Host == "" {
+ req.Host = req.Header["Host"]
}
+ req.Header["Host"] = "", false
fixPragmaCacheControl(req.Header)
// Pull out useful fields as a convenience to clients.
- if v, present := req.Header["Referer"]; present {
- req.Referer = v
- req.Header["Referer"] = "", false
- }
- if v, present := req.Header["User-Agent"]; present {
- req.UserAgent = v
- req.Header["User-Agent"] = "", false
- }
+ req.Referer = req.Header["Referer"]
+ req.Header["Referer"] = "", false
+
+ req.UserAgent = req.Header["User-Agent"]
+ req.Header["User-Agent"] = "", false
// TODO: Parse specific header values:
// Accept
@@ -572,7 +567,7 @@ func ReadRequest(b *bufio.Reader) (req *Request, err os.Error) {
}
func ParseQuery(query string) (m map[string][]string, err os.Error) {
- data := make(map[string]*vector.StringVector)
+ m = make(map[string][]string)
for _, kv := range strings.Split(query, "&", 0) {
kvPair := strings.Split(kv, "=", 2)
@@ -586,17 +581,9 @@ func ParseQuery(query string) (m map[string][]string, err os.Error) {
err = e
}
- vec, ok := data[key]
- if !ok {
- vec = new(vector.StringVector)
- data[key] = vec
- }
+ vec := vector.StringVector(m[key])
vec.Push(value)
- }
-
- m = make(map[string][]string)
- for k, vec := range data {
- m[k] = vec.Data()
+ m[key] = vec
}
return
@@ -618,7 +605,7 @@ func (r *Request) ParseForm() (err os.Error) {
r.Form = make(map[string][]string)
return os.ErrorString("missing form body")
}
- ct, _ := r.Header["Content-Type"]
+ ct := r.Header["Content-Type"]
switch strings.Split(ct, ";", 2)[0] {
case "text/plain", "application/x-www-form-urlencoded", "":
var b []byte
@@ -643,7 +630,7 @@ func (r *Request) FormValue(key string) string {
if r.Form == nil {
r.ParseForm()
}
- if vs, ok := r.Form[key]; ok && len(vs) > 0 {
+ if vs := r.Form[key]; len(vs) > 0 {
return vs[0]
}
return ""
diff --git a/src/pkg/http/response.go b/src/pkg/http/response.go
index 3a4637576..6a209c9f8 100644
--- a/src/pkg/http/response.go
+++ b/src/pkg/http/response.go
@@ -16,10 +16,10 @@ import (
"strings"
)
-var respExcludeHeader = map[string]int{
- "Content-Length": 0,
- "Transfer-Encoding": 0,
- "Trailer": 0,
+var respExcludeHeader = map[string]bool{
+ "Content-Length": true,
+ "Transfer-Encoding": true,
+ "Trailer": true,
}
// Response represents the response from an HTTP request.
@@ -133,7 +133,7 @@ func ReadResponse(r *bufio.Reader, requestMethod string) (resp *Response, err os
// like
// Cache-Control: no-cache
func fixPragmaCacheControl(header map[string]string) {
- if v, present := header["Pragma"]; present && v == "no-cache" {
+ if header["Pragma"] == "no-cache" {
if _, presentcc := header["Cache-Control"]; !presentcc {
header["Cache-Control"] = "no-cache"
}
@@ -157,8 +157,7 @@ func (r *Response) AddHeader(key, value string) {
// with a comma delimiter. If there were no response headers with the given
// key, GetHeader returns an empty string. Keys are not case sensitive.
func (r *Response) GetHeader(key string) (value string) {
- value, _ = r.Header[CanonicalHeaderKey(key)]
- return
+ return r.Header[CanonicalHeaderKey(key)]
}
// ProtoAtLeast returns whether the HTTP protocol used
@@ -228,11 +227,11 @@ func (resp *Response) Write(w io.Writer) os.Error {
return nil
}
-func writeSortedKeyValue(w io.Writer, kvm map[string]string, exclude map[string]int) os.Error {
+func writeSortedKeyValue(w io.Writer, kvm map[string]string, exclude map[string]bool) os.Error {
kva := make([]string, len(kvm))
i := 0
for k, v := range kvm {
- if _, exc := exclude[k]; !exc {
+ if !exclude[k] {
kva[i] = fmt.Sprint(k + ": " + v + "\r\n")
i++
}
diff --git a/src/pkg/http/transfer.go b/src/pkg/http/transfer.go
index 017077a99..26266cbca 100644
--- a/src/pkg/http/transfer.go
+++ b/src/pkg/http/transfer.go
@@ -340,11 +340,8 @@ func fixLength(status int, requestMethod string, header map[string]string, te []
// Logic based on media type. The purpose of the following code is just
// to detect whether the unsupported "multipart/byteranges" is being
// used. A proper Content-Type parser is needed in the future.
- if ct, present := header["Content-Type"]; present {
- ct = strings.ToLower(ct)
- if strings.Index(ct, "multipart/byteranges") >= 0 {
- return -1, ErrNotSupported
- }
+ if strings.Index(strings.ToLower(header["Content-Type"]), "multipart/byteranges") >= 0 {
+ return -1, ErrNotSupported
}
// Body-EOF logic based on other methods (like closing, or chunked coding)