From e20e6980e9167492dc2579dd4001eb999bc92c53 Mon Sep 17 00:00:00 2001 From: "Matt T. Proud" Date: Sun, 14 Jul 2013 23:03:56 +0200 Subject: [PATCH] Completely extract response payload for decoding. This commit forces the extraction framework to read the entire response payload into a buffer before attempting to decode it, for the underlying Protocol Buffer message readers do not block on partial messages. --- retrieval/target.go | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/retrieval/target.go b/retrieval/target.go index 92815b35c9..c3354b2a6a 100644 --- a/retrieval/target.go +++ b/retrieval/target.go @@ -10,9 +10,11 @@ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. + package retrieval import ( + "bytes" "fmt" "log" "net/http" @@ -236,7 +238,15 @@ func (t *target) scrape(timestamp time.Time, results chan<- *extraction.Result) BaseLabels: baseLabels, } - return processor.ProcessSingle(resp.Body, results, processOptions) + // N.B. - It is explicitly required to extract the entire payload before + // attempting to deserialize, as the underlying reader expects will + // interpret pending data as a truncated message. + buf := new(bytes.Buffer) + if _, err := buf.ReadFrom(resp.Body); err != nil { + return err + } + + return processor.ProcessSingle(buf, results, processOptions) } func (t target) State() TargetState {