diff --git a/builder/remote.go b/builder/remote.go index f3a4329d16..b790301619 100644 --- a/builder/remote.go +++ b/builder/remote.go @@ -129,7 +129,7 @@ func inspectResponse(ct string, r io.ReadCloser, clen int64) (string, io.ReadClo return ct, r, err } - preambleR := bytes.NewReader(preamble) + preambleR := bytes.NewReader(preamble[:rlen]) bodyReader := ioutil.NopCloser(io.MultiReader(preambleR, r)) // Some web servers will use application/octet-stream as the default // content type for files without an extension (e.g. 'Dockerfile') diff --git a/builder/remote_test.go b/builder/remote_test.go index 691a084761..588eb85015 100644 --- a/builder/remote_test.go +++ b/builder/remote_test.go @@ -151,6 +151,26 @@ func TestInspectResponseEmptyContentType(t *testing.T) { } } +func TestUnknownContentLength(t *testing.T) { + content := []byte(dockerfileContents) + ct := "text/plain" + br := ioutil.NopCloser(bytes.NewReader(content)) + contentType, bReader, err := inspectResponse(ct, br, -1) + if err != nil { + t.Fatal(err) + } + if contentType != "text/plain" { + t.Fatalf("Content type should be 'text/plain' but is %q", contentType) + } + body, err := ioutil.ReadAll(bReader) + if err != nil { + t.Fatal(err) + } + if string(body) != dockerfileContents { + t.Fatalf("Corrupted response body %s", body) + } +} + func TestMakeRemoteContext(t *testing.T) { contextDir, cleanup := createTestTempDir(t, "", "builder-tarsum-test") defer cleanup()