proxy.ServeHTTP(w, r)
        }
 }
+
+func TestServeHTTPDeepCopy(t *testing.T) {
+       backend := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+               w.Write([]byte("Hello Gopher!"))
+       }))
+       defer backend.Close()
+       backendURL, err := url.Parse(backend.URL)
+       if err != nil {
+               t.Fatal(err)
+       }
+
+       type result struct {
+               before, after string
+       }
+
+       resultChan := make(chan result, 1)
+       proxyHandler := NewSingleHostReverseProxy(backendURL)
+       frontend := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+               before := r.URL.String()
+               proxyHandler.ServeHTTP(w, r)
+               after := r.URL.String()
+               resultChan <- result{before: before, after: after}
+       }))
+       defer frontend.Close()
+
+       want := result{before: "/", after: "/"}
+
+       res, err := frontend.Client().Get(frontend.URL)
+       if err != nil {
+               t.Fatalf("Do: %v", err)
+       }
+       res.Body.Close()
+
+       got := <-resultChan
+       if got != want {
+               t.Errorf("got = %+v; want = %+v", got, want)
+       }
+}
 
 import (
        "bufio"
        "bytes"
+       "context"
        "encoding/base64"
        "fmt"
        "io"
        }
 }
 
+func TestWithContextDeepCopiesURL(t *testing.T) {
+       req, err := NewRequest("POST", "https://golang.org/", nil)
+       if err != nil {
+               t.Fatal(err)
+       }
+
+       reqCopy := req.WithContext(context.Background())
+       reqCopy.URL.Scheme = "http"
+
+       firstURL, secondURL := req.URL.String(), reqCopy.URL.String()
+       if firstURL == secondURL {
+               t.Errorf("unexpected change to original request's URL")
+       }
+}
+
 // verify that NewRequest sets Request.GetBody and that it works
 func TestNewRequestGetBody(t *testing.T) {
        tests := []struct {