From d6b1fa8e02cd8a55260a468f29a3b7b478314602 Mon Sep 17 00:00:00 2001 From: jhadvig Date: Thu, 2 Oct 2014 02:19:00 +0200 Subject: [PATCH] Support for streaming --- pkg/client/request.go | 21 ++++++++++++++++++++ pkg/client/request_test.go | 39 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 60 insertions(+) diff --git a/pkg/client/request.go b/pkg/client/request.go index 0884b2d00f6..17b84ad0436 100644 --- a/pkg/client/request.go +++ b/pkg/client/request.go @@ -224,6 +224,27 @@ func (r *Request) Watch() (watch.Interface, error) { return watch.NewStreamWatcher(watchjson.NewDecoder(response.Body, r.c.Codec)), nil } +// Stream formats and executes the request, and offers streaming of the response. +// Returns io.ReadCloser which could be used for streaming of the response, or an error +func (r *Request) Stream() (io.ReadCloser, error) { + if r.err != nil { + return nil, r.err + } + req, err := http.NewRequest(r.verb, r.finalURL(), nil) + if err != nil { + return nil, err + } + client := r.c.Client + if client == nil { + client = http.DefaultClient + } + response, err := client.Do(req) + if err != nil { + return nil, err + } + return response.Body, nil +} + // Do formats and executes the request. Returns the API object received, or an error. func (r *Request) Do() Result { for { diff --git a/pkg/client/request_test.go b/pkg/client/request_test.go index 2e06f3f2f5a..bb932c563d6 100644 --- a/pkg/client/request_test.go +++ b/pkg/client/request_test.go @@ -439,3 +439,42 @@ func TestWatch(t *testing.T) { t.Fatal("Unexpected non-close") } } + +func TestStream(t *testing.T) { + auth := &Config{Username: "user", Password: "pass"} + expectedBody := "expected body" + + testServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + checkAuth(t, auth, r) + flusher, ok := w.(http.Flusher) + if !ok { + panic("need flusher!") + } + w.Header().Set("Transfer-Encoding", "chunked") + w.WriteHeader(http.StatusOK) + w.Write([]byte(expectedBody)) + flusher.Flush() + })) + + s, err := New(&Config{ + Host: testServer.URL, + Version: "v1beta1", + Username: "user", + Password: "pass", + }) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + readCloser, err := s.Get().Path("path/to/stream/thing").Stream() + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + defer readCloser.Close() + buf := new(bytes.Buffer) + buf.ReadFrom(readCloser) + resultBody := buf.String() + + if expectedBody != resultBody { + t.Errorf("Expected %s, got %s", expectedBody, resultBody) + } +}