http: add PostForm function to post url-encoded key/value data.

This is a common task, so it makes sense to have a helper to do it.

(App Engine doesn't like "Transfer-Encoding: chunked" for POST
bodies, which is the default for regular Post.)

R=rsc
CC=golang-dev
https://golang.org/cl/2113041
This commit is contained in:
Andrew Gerrand 2010-09-02 10:01:34 +10:00
parent f8a67d79d1
commit 2fe0f8da52

View file

@ -8,12 +8,14 @@ package http
import (
"bufio"
"bytes"
"crypto/tls"
"encoding/base64"
"fmt"
"io"
"net"
"os"
"strconv"
"strings"
)
@ -161,6 +163,48 @@ func Post(url string, bodyType string, body io.Reader) (r *Response, err os.Erro
return send(&req)
}
// PostForm issues a POST to the specified URL,
// with data's keys and values urlencoded as the request body.
//
// Caller should close r.Body when done reading it.
func PostForm(url string, data map[string]string) (r *Response, err os.Error) {
var req Request
req.Method = "POST"
req.ProtoMajor = 1
req.ProtoMinor = 1
req.Close = true
body := urlencode(data)
req.Body = nopCloser{body}
req.Header = map[string]string{
"Content-Type": "application/x-www-form-urlencoded",
"Content-Length": strconv.Itoa(body.Len()),
}
req.ContentLength = int64(body.Len())
req.URL, err = ParseURL(url)
if err != nil {
return nil, err
}
return send(&req)
}
func urlencode(data map[string]string) (b *bytes.Buffer) {
b = new(bytes.Buffer)
first := true
for k, v := range data {
if first {
first = false
} else {
b.WriteByte('&')
}
b.WriteString(URLEscape(k))
b.WriteByte('=')
b.WriteString(URLEscape(v))
}
return
}
// Head issues a HEAD to the specified URL.
func Head(url string) (r *Response, err os.Error) {
var req Request