package requests import ( "bytes" "compress/gzip" "compress/zlib" "io" "io/ioutil" "net/http" ) // Response 响应内容包含http.Response type Response struct { DContent string GResponse *http.Response } // FromHTTPResponse 生成Response 从标准http.Response func FromHTTPResponse(resp *http.Response) (*Response, error) { // 复制response 返回内容 并且测试是否有解压的需求 srcbuf, err := ioutil.ReadAll(resp.Body) if err != nil { panic(err) } resp.Body.Close() cbuf := bytes.NewBuffer([]byte{}) _, err = io.Copy(cbuf, bytes.NewReader(srcbuf)) if err != nil { panic(err) } resp.Body = ioutil.NopCloser(cbuf) content := string(srcbuf) srcReader := bytes.NewReader(srcbuf) if r, err := gzip.NewReader(srcReader); err == nil { defer r.Close() buf, err := ioutil.ReadAll(r) if err != nil { panic(err) } content = string(buf) } else if r, err := zlib.NewReader(srcReader); err == nil { defer r.Close() buf, err := ioutil.ReadAll(r) if err != nil { panic(err) } content = string(buf) } return &Response{DContent: content, GResponse: resp}, nil } // Content 返回解压后的内容 func (gresp *Response) Content() string { return gresp.DContent }