// Proxies client requests to their original destination func requestHandler(r *http.Request, c *cassette.Cassette, mode RecorderMode) ( *cassette.Interaction, error) { // Return interaction from cassette if in replay mode if mode == ModeReplaying { return c.GetInteraction(r) } c.RequestStated(r.URL.String()) // Copy the original request, so we can read the form values reqBytes, err := httputil.DumpRequestOut(r, true) if err != nil { return nil, err } reqBuffer := bytes.NewBuffer(reqBytes) copiedReq, err := http.ReadRequest(bufio.NewReader(reqBuffer)) if err != nil { return nil, err } err = copiedReq.ParseForm() if err != nil { return nil, err } // Perform client request to it's original // destination and record interactions body := ioutil.NopCloser(r.Body) req, err := http.NewRequest(r.Method, r.URL.String(), body) if err != nil { return nil, err } req.Header = r.Header resp, err := http.DefaultClient.Do(req) if err != nil { return nil, err } // Record the interaction and add it to the cassette reqBody, err := ioutil.ReadAll(req.Body) if err != nil { return nil, err } respBody, err := ioutil.ReadAll(resp.Body) if err != nil { return nil, err } c.RequestFinished(r.URL.String()) // Add interaction to cassette interaction := &cassette.Interaction{ Request: cassette.Request{ Body: string(reqBody), Form: copiedReq.PostForm, Headers: req.Header, URL: req.URL.String(), Method: req.Method, }, Response: cassette.Response{ Body: string(respBody), Headers: resp.Header, Status: resp.Status, Code: resp.StatusCode, }, } c.AddInteraction(interaction) return interaction, nil }