@@ -16,6 +16,7 @@ import (
1616const (
1717 FieldServerName = "ServerName"
1818 FieldContentSize = "ContentSize"
19+ MaxBufferSize = 8192
1920)
2021
2122var (
@@ -27,16 +28,25 @@ type HTTPWorker struct {
2728 client * http.Client
2829 jobs chan * http.Request
2930 collector chan * Record
30- readBuf * bytes. Buffer
31+ discard io. ReaderFrom
3132}
3233
3334func NewHTTPWorker (context * Context , jobs chan * http.Request , collector chan * Record ) * HTTPWorker {
35+
36+ var buf []byte
37+ contentSize := context .GetInt (FieldContentSize )
38+ if contentSize < MaxBufferSize {
39+ buf = make ([]byte , contentSize )
40+ } else {
41+ buf = make ([]byte , MaxBufferSize )
42+ }
43+
3444 return & HTTPWorker {
3545 context ,
3646 NewClient (context .config ),
3747 jobs ,
3848 collector ,
39- bytes . NewBuffer ( make ([] byte , 0 , context . GetInt ( FieldContentSize ) + bytes . MinRead )) ,
49+ & Discard { buf } ,
4050 }
4151}
4252
@@ -111,8 +121,7 @@ func (h *HTTPWorker) send(request *http.Request) (asyncResult chan *Record) {
111121 return
112122 }
113123
114- defer h .readBuf .Reset ()
115- contentSize , err = h .readBuf .ReadFrom (resp .Body )
124+ contentSize , err = h .discard .ReadFrom (resp .Body )
116125
117126 if err != nil {
118127 record .Error = & ReceiveError {err }
@@ -137,6 +146,24 @@ func (h *HTTPWorker) send(request *http.Request) (asyncResult chan *Record) {
137146 return asyncResult
138147}
139148
149+ type Discard struct {
150+ blackHole []byte
151+ }
152+
153+ func (d * Discard ) ReadFrom (r io.Reader ) (n int64 , err error ) {
154+ readSize := 0
155+ for {
156+ readSize , err = r .Read (d .blackHole )
157+ n += int64 (readSize )
158+ if err != nil {
159+ if err == io .EOF {
160+ return n , nil
161+ }
162+ return
163+ }
164+ }
165+ }
166+
140167func DetectHost (context * Context ) (err error ) {
141168 defer func () {
142169 if r := recover (); r != nil {
0 commit comments