func (c *Client) request(credentials *Credentials, url string, param web.ParamMap) (*Credentials, web.ParamMap, os.Error) { c.SignParam(credentials, "POST", url, param) resp, err := http.PostForm(url, param.StringMap()) if err != nil { return nil, nil, err } p, err := ioutil.ReadAll(resp.Body) resp.Body.Close() if err != nil { return nil, nil, err } if resp.StatusCode != 200 { return nil, nil, os.NewError(fmt.Sprintf("OAuth server status %d, %s", resp.StatusCode, string(p))) } m := make(web.ParamMap) err = m.ParseFormEncodedBytes(p) if err != nil { return nil, nil, err } credentials = &Credentials{Token: m.Get("oauth_token"), Secret: m.Get("oauth_token_secret")} if credentials.Token == "" { return nil, nil, os.NewError("No OAuth token in server result") } if credentials.Secret == "" { return nil, nil, os.NewError("No OAuth secret in server result") } return credentials, m, nil }
// Data in param must be URL escaped already. func (tw *twitterClient) twitterPost(url string, param web.ParamMap) (p []byte, err os.Error) { oauthClient.SignParam(tw.twitterToken, "POST", url, param) // TODO: remove this dupe. var resp *http.Response done := make(chan bool, 1) go func() { resp, err = http.PostForm(url, param.StringMap()) done <- true }() timeout := time.After(TWITTER_GET_TIMEOUT * 1e9) // post in this case. select { case <-done: break case <-timeout: return nil, os.NewError("http POST timed out - " + url) } if resp == nil { panic("oops") } return readHttpResponse(resp, err) }