本文整理汇总了Golang中net/http.ReadResponse函数的典型用法代码示例。如果您正苦于以下问题:Golang ReadResponse函数的具体用法?Golang ReadResponse怎么用?Golang ReadResponse使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了ReadResponse函数的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Golang代码示例。
示例1: TestServeHTTPReadRequestError
func TestServeHTTPReadRequestError(t *testing.T) {
p := NewProxy(mitm)
// Shorten the timeout to force a ReadRequest error.
p.Timeout = time.Second
rc, wc := pipeWithTimeout()
defer rc.Close()
defer wc.Close()
rw := newHijackRecorder(wc)
req, err := http.NewRequest("CONNECT", "//www.example.com:443", nil)
if err != nil {
t.Fatalf("http.NewRequest(): got %v, want no error", err)
}
go p.ServeHTTP(rw, req)
res, err := http.ReadResponse(bufio.NewReader(rc), req)
if err != nil {
t.Fatalf("http.ReadResponse(): got %v, want no error", err)
}
res.Body.Close()
tlsConn := tlsClient(rc, p.mitm.Authority, "www.example.com")
tlsConn.Write([]byte("INVALID /invalid NOTHTTP/1.1\r\n"))
if _, err = http.ReadResponse(bufio.NewReader(tlsConn), nil); err != io.ErrUnexpectedEOF {
t.Fatalf("http.ReadResponse(): got %v, want io.ErrUnexpectedEOF", err)
}
}
示例2: TestServeHTTPKeepAlive
func TestServeHTTPKeepAlive(t *testing.T) {
p := NewProxy(mitm)
rc, wc := pipeWithTimeout()
defer rc.Close()
defer wc.Close()
rw := newHijackRecorder(wc)
req, err := http.NewRequest("CONNECT", "//www.example.com:443", nil)
if err != nil {
t.Fatalf("http.NewRequest(): got %v, want no error", err)
}
go p.ServeHTTP(rw, req)
res, err := http.ReadResponse(bufio.NewReader(rc), req)
if err != nil {
t.Fatalf("http.ReadResponse(): got %v, want no error", err)
}
res.Body.Close()
tlsConn := tlsClient(rc, p.mitm.Authority, "www.example.com")
tt := []struct {
closing bool
}{
{false},
{false},
{true},
}
for _, tc := range tt {
req, err = http.NewRequest("GET", "https://www.example.com/", nil)
if err != nil {
t.Fatalf("http.NewRequest(): got %v, want no error", err)
}
// Close the connection on the last request.
if tc.closing {
req.Header.Set("Connection", "close")
}
if err := req.Write(tlsConn); err != nil {
t.Fatalf("req.Write(): got %v, want no error", err)
}
res, err = http.ReadResponse(bufio.NewReader(tlsConn), nil)
if err != nil {
t.Fatalf("http.ReadResponse(): got %v, want no error", err)
}
res.Body.Close()
if got, want := res.StatusCode, 200; got != want {
t.Errorf("res.StatusCode: got %d, want %d", got, want)
}
if tc.closing && !res.Close {
t.Error("res.Close: got false, want true")
}
}
}
示例3: TestServeHTTPConnectRequestWithoutMITM
func TestServeHTTPConnectRequestWithoutMITM(t *testing.T) {
p := NewProxy(nil)
f := func(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("secret!"))
}
server := httptest.NewTLSServer(http.HandlerFunc(f))
defer server.Close()
rc, wc := pipeWithTimeout()
defer rc.Close()
defer wc.Close()
rw := newHijackRecorder(wc)
req, err := http.NewRequest("CONNECT", server.URL, nil)
if err != nil {
t.Fatalf("http.NewRequest(%q, %q, nil): got %v, want no error", "CONNECT", server.URL, err)
}
go p.ServeHTTP(rw, req)
res, err := http.ReadResponse(bufio.NewReader(rc), req)
if err != nil {
t.Fatalf("http.ReadResponse(): got %v, want no error", err)
}
if got, want := res.StatusCode, 200; got != want {
t.Errorf("res.StatusCode: got %d, want %d", got, want)
}
req, err = http.NewRequest("GET", server.URL, nil)
if err != nil {
t.Fatalf("http.NewRequest(%q, %q, nil): got %v, want no error", "GET", server.URL, err)
}
req.Header.Set("Connection", "close")
tlsrc := tls.Client(rc, &tls.Config{
InsecureSkipVerify: true,
})
go req.Write(tlsrc)
res, err = http.ReadResponse(bufio.NewReader(tlsrc), req)
if err != nil {
t.Fatalf("http.ReadResponse(): got %v, want no error", err)
}
got, err := ioutil.ReadAll(res.Body)
if err != nil {
t.Fatalf("ioutil.ReadAll(res.Body): got %v, want no error", err)
}
res.Body.Close()
if want := []byte("secret!"); !bytes.Equal(got, want) {
t.Errorf("res.Body: got %q, want %q", got, want)
}
}
示例4: StaticResponder
// StaticResponder returns an HTTP response generator that parses res
// for an entire HTTP response, including headers and body.
func StaticResponder(res string) func() *http.Response {
_, err := http.ReadResponse(bufio.NewReader(strings.NewReader(res)), nil)
if err != nil {
panic("Invalid response given to StaticResponder: " + err.Error())
}
return func() *http.Response {
res, _ := http.ReadResponse(bufio.NewReader(strings.NewReader(res)), nil)
return res
}
}
示例5: TestServeHTTPBuildsValidRequest
func TestServeHTTPBuildsValidRequest(t *testing.T) {
p := NewProxy(mitm)
p.RoundTripper = RoundTripFunc(func(req *http.Request) (*http.Response, error) {
if got, want := req.URL.Scheme, "https"; got != want {
t.Errorf("req.URL.Scheme: got %q, want %q", got, want)
}
if got, want := req.URL.Host, "www.example.com"; got != want {
t.Errorf("req.URL.Host: got %q, want %q", got, want)
}
if req.RemoteAddr == "" {
t.Error("req.RemoteAddr: got empty, want addr")
}
return proxyutil.NewResponse(201, nil, req), nil
})
rc, wc := pipeWithTimeout()
defer rc.Close()
defer wc.Close()
rw := newHijackRecorder(wc)
req, err := http.NewRequest("CONNECT", "//www.example.com:443", nil)
if err != nil {
t.Fatalf("http.NewRequest(): got %v, want no error", err)
}
go p.ServeHTTP(rw, req)
res, err := http.ReadResponse(bufio.NewReader(rc), req)
if err != nil {
t.Fatalf("http.ReadResponse(): got %v, want no error", err)
}
res.Body.Close()
tlsConn := tlsClient(rc, p.mitm.Authority, "www.example.com")
req, err = http.NewRequest("GET", "https://www.example.com", nil)
if err != nil {
t.Fatalf("http.NewRequest(): got %v, want no erro", err)
}
req.Header.Set("Connection", "close")
if err := req.Write(tlsConn); err != nil {
t.Fatalf("req.Write(): got %v, want no error", err)
}
res, err = http.ReadResponse(bufio.NewReader(tlsConn), nil)
if err != nil {
t.Fatalf("http.ReadResponse(): got %v, want no error", err)
}
defer res.Body.Close()
if got, want := res.StatusCode, 201; got != want {
t.Errorf("res.StatusCode: got %d, want %d", got, want)
}
}
示例6: ProxyImage
// load an external image or fetch it from the cache
// and write it to the ResponseWriter
func (ipw *ImgProxy) ProxyImage(w http.ResponseWriter, req *http.Request, url string) (err error) {
cacheKey := ipw.cacheKey(url)
xCacheHeader := "HIT"
var resp *http.Response
// attempt to read from cache
cachedData, ok := ipw.cache.Get(cacheKey)
if ok {
b := bytes.NewBuffer(cachedData)
resp, err = http.ReadResponse(bufio.NewReader(b), req)
if err != nil {
log.Printf("Unable to read cached entry for %s: %v (cacheKey: %s)", url, err, cacheKey)
// remove any invalid data from the cache and
// fetch it fresh from upstream
ipw.cache.Delete(cacheKey)
resp = nil
}
}
// fetch from upstream
if resp == nil {
xCacheHeader = "MISS"
downloadedData := <-ipw.fetchFromUpstream(url)
if downloadedData.err != nil {
return downloadedData.err
}
resp, err = http.ReadResponse(bufio.NewReader(bytes.NewBuffer(downloadedData.httpResponseData)), req)
if err != nil {
return err
}
}
// write to responsewriter
copyHeader(w, resp, "Last-Modified")
copyHeader(w, resp, "Expires")
copyHeader(w, resp, "Etag")
w.Header()[http.CanonicalHeaderKey("X-Cache")] = []string{xCacheHeader}
if is304 := check304(req, resp); is304 {
w.WriteHeader(http.StatusNotModified)
return
}
copyHeader(w, resp, "Content-Length")
copyHeader(w, resp, "Content-Type")
w.WriteHeader(resp.StatusCode)
io.Copy(w, resp.Body)
return nil
}
示例7: TestServeHTTPModifyResponseError
func TestServeHTTPModifyResponseError(t *testing.T) {
p := NewProxy(mitm)
f := func(*Context, *http.Response) error {
return fmt.Errorf("modifier error")
}
p.SetResponseModifier(ResponseModifierFunc(f))
rc, wc := pipeWithTimeout()
defer rc.Close()
defer wc.Close()
rw := newHijackRecorder(wc)
req, err := http.NewRequest("CONNECT", "//www.example.com:443", nil)
if err != nil {
t.Fatalf("http.NewRequest(): got %v, want no error", err)
}
go p.ServeHTTP(rw, req)
res, err := http.ReadResponse(bufio.NewReader(rc), req)
if err != nil {
t.Fatalf("http.ReadResponse(): got %v, want no error", err)
}
res.Body.Close()
tlsConn := tlsClient(rc, p.mitm.Authority, "www.example.com")
req, err = http.NewRequest("GET", "https://www.example.com/", nil)
if err != nil {
t.Fatalf("http.NewRequest(): got %v, want no erro", err)
}
if err := req.Write(tlsConn); err != nil {
t.Fatalf("req.Write(): got %v, want no error", err)
}
res, err = http.ReadResponse(bufio.NewReader(tlsConn), nil)
if err != nil {
t.Fatalf("http.ReadResponse(): got %v, want no error", err)
}
defer res.Body.Close()
if got, want := res.StatusCode, 400; got != want {
t.Errorf("res.StatusCode: got %d, want %d", got, want)
}
got, err := ioutil.ReadAll(res.Body)
if err != nil {
t.Fatalf("ioutil.ReadAll(): got %v, want no error", err)
}
if want := []byte("modifier error"); !bytes.Equal(got, want) {
t.Errorf("res.Body: got %q, want %q", got, want)
}
}
示例8: TestServeHTTPSkipRoundTrip
func TestServeHTTPSkipRoundTrip(t *testing.T) {
p := NewProxy(mitm)
f := func(ctx *Context, _ *http.Request) error {
ctx.SkipRoundTrip = true
return nil
}
p.SetRequestModifier(RequestModifierFunc(f))
p.RoundTripper = RoundTripFunc(func(*http.Request) (*http.Response, error) {
t.Fatal("RoundTrip(): got called, want skipped")
return nil, nil
})
rc, wc := pipeWithTimeout()
defer rc.Close()
defer wc.Close()
rw := newHijackRecorder(wc)
req, err := http.NewRequest("CONNECT", "//www.example.com:443", nil)
if err != nil {
t.Fatalf("http.NewRequest(): got %v, want no error", err)
}
go p.ServeHTTP(rw, req)
res, err := http.ReadResponse(bufio.NewReader(rc), req)
if err != nil {
t.Fatalf("http.ReadResponse(): got %v, want no error", err)
}
res.Body.Close()
tlsConn := tlsClient(rc, p.mitm.Authority, "www.example.com")
req, err = http.NewRequest("GET", "https://www.example.com/", nil)
if err != nil {
t.Fatalf("http.NewRequest(): got %v, want no error", err)
}
req.Header.Set("Connection", "close")
if err := req.Write(tlsConn); err != nil {
t.Fatalf("req.Write(): got %v, want no error", err)
}
res, err = http.ReadResponse(bufio.NewReader(tlsConn), nil)
if err != nil {
t.Fatalf("http.ReadResponse(): got %v, want no error", err)
}
defer res.Body.Close()
if got, want := res.StatusCode, 200; got != want {
t.Errorf("res.StatusCode: got %d, want %d", got, want)
}
}
示例9: RoundTrip
func (st *supervisorTransport) RoundTrip(req *http.Request) (*http.Response, error) {
if req.URL == nil {
return nil, errors.New("unix: nil Request.URL")
}
if req.Header == nil {
return nil, errors.New("unix: nil Request.Header")
}
if req.URL.Scheme != "unix" {
panic("unix: unsupported protocol scheme")
}
sock, err := net.Dial("unix", req.URL.Path)
if err != nil {
return nil, err
}
defer sock.Close()
//create shallow copy of request object
newReq := new(http.Request)
*newReq = *req
newReq.URL = supervisorURL
newReq.Write(sock)
return http.ReadResponse(bufio.NewReader(sock), req)
}
示例10: parseSearchResponse
func parseSearchResponse(httpResponse io.Reader, responseAddr *net.UDPAddr) (*SearchResponse, error) {
reader := bufio.NewReader(httpResponse)
request := &http.Request{} // Needed for ReadResponse but doesn't have to be real
response, err := http.ReadResponse(reader, request)
if err != nil {
return nil, err
}
headers := response.Header
res := &SearchResponse{}
res.Control = headers.Get("cache-control")
res.Server = headers.Get("server")
res.ST = headers.Get("st")
res.Ext = headers.Get("ext")
res.USN = headers.Get("usn")
res.ResponseAddr = responseAddr
if headers.Get("location") != "" {
res.Location, err = response.Location()
if err != nil {
return nil, err
}
}
date := headers.Get("date")
if date != "" {
res.Date, err = http.ParseTime(date)
if err != nil {
return nil, err
}
}
return res, nil
}
示例11: do
func (c *Client) do(method, path string, doOptions doOptions) ([]byte, int, error) {
var params io.Reader
if doOptions.data != nil || doOptions.forceJSON {
buf, err := json.Marshal(doOptions.data)
if err != nil {
return nil, -1, err
}
params = bytes.NewBuffer(buf)
}
if path != "/version" && !c.SkipServerVersionCheck && c.expectedAPIVersion == nil {
err := c.checkAPIVersion()
if err != nil {
return nil, -1, err
}
}
req, err := http.NewRequest(method, c.getURL(path), params)
if err != nil {
return nil, -1, err
}
req.Header.Set("User-Agent", userAgent)
if doOptions.data != nil {
req.Header.Set("Content-Type", "application/json")
} else if method == "POST" {
req.Header.Set("Content-Type", "plain/text")
}
var resp *http.Response
protocol := c.endpointURL.Scheme
address := c.endpointURL.Path
if protocol == "unix" {
var dial net.Conn
dial, err = net.Dial(protocol, address)
if err != nil {
return nil, -1, err
}
defer dial.Close()
breader := bufio.NewReader(dial)
err = req.Write(dial)
if err != nil {
return nil, -1, err
}
resp, err = http.ReadResponse(breader, req)
} else {
resp, err = c.HTTPClient.Do(req)
}
if err != nil {
if strings.Contains(err.Error(), "connection refused") {
return nil, -1, ErrConnectionRefused
}
return nil, -1, err
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
return nil, -1, err
}
if resp.StatusCode < 200 || resp.StatusCode >= 400 {
return nil, resp.StatusCode, newError(resp.StatusCode, body)
}
return body, resp.StatusCode, nil
}
示例12: TestContentLengthZero
// TestContentLengthZero tests that for both an HTTP/1.0 and HTTP/1.1
// request (both keep-alive), when a Handler never writes any
// response, the net/http package adds a "Content-Length: 0" response
// header.
func TestContentLengthZero(t *testing.T) {
ts := httptest.NewServer(http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) {}))
defer ts.Close()
for _, version := range []string{"HTTP/1.0", "HTTP/1.1"} {
conn, err := net.Dial("tcp", ts.Listener.Addr().String())
if err != nil {
t.Fatalf("error dialing: %v", err)
}
_, err = fmt.Fprintf(conn, "GET / %v\r\nConnection: keep-alive\r\nHost: foo\r\n\r\n", version)
if err != nil {
t.Fatalf("error writing: %v", err)
}
req, _ := http.NewRequest("GET", "/", nil)
res, err := http.ReadResponse(bufio.NewReader(conn), req)
if err != nil {
t.Fatalf("error reading response: %v", err)
}
if te := res.TransferEncoding; len(te) > 0 {
t.Errorf("For version %q, Transfer-Encoding = %q; want none", version, te)
}
if cl := res.ContentLength; cl != 0 {
t.Errorf("For version %q, Content-Length = %v; want 0", version, cl)
}
conn.Close()
}
}
示例13: TestCopyError
// TestCopyError tests that we kill the process if there's an error copying
// its output. (for example, from the client having gone away)
func TestCopyError(t *testing.T) {
check(t)
if runtime.GOOS == "windows" {
t.Skipf("skipping test on %q", runtime.GOOS)
}
h := &Handler{
Path: "testdata/test.cgi",
Root: "/test.cgi",
}
ts := httptest.NewServer(h)
defer ts.Close()
conn, err := net.Dial("tcp", ts.Listener.Addr().String())
if err != nil {
t.Fatal(err)
}
req, _ := http.NewRequest("GET", "http://example.com/test.cgi?bigresponse=1", nil)
err = req.Write(conn)
if err != nil {
t.Fatalf("Write: %v", err)
}
res, err := http.ReadResponse(bufio.NewReader(conn), req)
if err != nil {
t.Fatalf("ReadResponse: %v", err)
}
pidstr := res.Header.Get("X-CGI-Pid")
if pidstr == "" {
t.Fatalf("expected an X-CGI-Pid header in response")
}
pid, err := strconv.Atoi(pidstr)
if err != nil {
t.Fatalf("invalid X-CGI-Pid value")
}
var buf [5000]byte
n, err := io.ReadFull(res.Body, buf[:])
if err != nil {
t.Fatalf("ReadFull: %d bytes, %v", n, err)
}
childRunning := func() bool {
return isProcessRunning(t, pid)
}
if !childRunning() {
t.Fatalf("pre-conn.Close, expected child to be running")
}
conn.Close()
tries := 0
for tries < 25 && childRunning() {
time.Sleep(50 * time.Millisecond * time.Duration(tries))
tries++
}
if childRunning() {
t.Fatalf("post-conn.Close, expected child to be gone")
}
}
示例14: parseResponse
func parseResponse(msg, hostPort string) *ResponseMessage {
resp, err := http.ReadResponse(bufio.NewReader(strings.NewReader(msg)), nil)
if err != nil {
return nil
}
defer resp.Body.Close()
maxAge := -1
if cc := resp.Header.Get("CACHE-CONTROL"); cc != "" {
subMatch := cacheControlAge.FindStringSubmatch(cc)
if len(subMatch) == 2 {
maxAgeInt64, err := strconv.ParseInt(subMatch[1], 10, 0)
if err == nil {
maxAge = int(maxAgeInt64)
}
}
}
usn := resp.Header.Get("USN")
deviceId, urn := extractUrnDeviceIdFromUsn(usn)
respMessage := ResponseMessage{
MaxAge: maxAge,
SearchType: resp.Header.Get("ST"),
Usn: usn,
Urn: urn,
DeviceId: deviceId,
Location: resp.Header.Get("LOCATION"),
Server: resp.Header.Get("SERVER"),
RawResponse: resp,
}
return &respMessage
}
示例15: ServeHTTP
func (this Tunnel) ServeHTTP(response http.ResponseWriter, request *http.Request) {
conn, err := this.session.Open()
if err != nil {
log.Println(err.Error())
response.Write([]byte("<html><body>" + err.Error() + "</body></html>"))
return
}
defer conn.Close()
if err := request.Write(conn); err != nil {
log.Println(err.Error())
return
}
tunnelResponse, err := http.ReadResponse(bufio.NewReader(conn), request)
if err != nil {
response.Write([]byte("<html><body>" + err.Error() + "</body></html>"))
return
}
for header, values := range tunnelResponse.Header {
for _, value := range values {
response.Header().Add(header, value)
}
}
response.WriteHeader(tunnelResponse.StatusCode)
if tunnelResponse.Body != nil {
io.Copy(response, tunnelResponse.Body)
}
}