diff options
Diffstat (limited to 'http/response/xml')
-rw-r--r-- | http/response/xml/doc.go | 10 | ||||
-rw-r--r-- | http/response/xml/xml.go | 25 | ||||
-rw-r--r-- | http/response/xml/xml_test.go | 83 |
3 files changed, 108 insertions, 10 deletions
diff --git a/http/response/xml/doc.go b/http/response/xml/doc.go new file mode 100644 index 0000000..908d2f9 --- /dev/null +++ b/http/response/xml/doc.go @@ -0,0 +1,10 @@ +// Copyright 2018 Frédéric Guillot. All rights reserved. +// Use of this source code is governed by the MIT license +// that can be found in the LICENSE file. + +/* + +Package xml contains XML response functions. + +*/ +package xml // import "miniflux.app/http/response/xml" diff --git a/http/response/xml/xml.go b/http/response/xml/xml.go index bceb5f1..771a85e 100644 --- a/http/response/xml/xml.go +++ b/http/response/xml/xml.go @@ -5,19 +5,24 @@ package xml // import "miniflux.app/http/response/xml" import ( - "fmt" "net/http" + + "miniflux.app/http/response" ) -// OK sends a XML document. -func OK(w http.ResponseWriter, data string) { - w.Header().Set("Content-Type", "text/xml") - w.Write([]byte(data)) +// OK writes a standard XML response with a status 200 OK. +func OK(w http.ResponseWriter, r *http.Request, body interface{}) { + builder := response.New(w, r) + builder.WithHeader("Content-Type", "text/xml; charset=utf-8") + builder.WithBody(body) + builder.Write() } -// Attachment forces the download of a XML document. -func Attachment(w http.ResponseWriter, filename, data string) { - w.Header().Set("Content-Type", "text/xml") - w.Header().Set("Content-Disposition", fmt.Sprintf("attachment; filename=%s", filename)) - w.Write([]byte(data)) +// Attachment forces the XML document to be downloaded by the web browser. +func Attachment(w http.ResponseWriter, r *http.Request, filename string, body interface{}) { + builder := response.New(w, r) + builder.WithHeader("Content-Type", "text/xml; charset=utf-8") + builder.WithAttachment(filename) + builder.WithBody(body) + builder.Write() } diff --git a/http/response/xml/xml_test.go b/http/response/xml/xml_test.go new file mode 100644 index 0000000..ada6bd4 --- /dev/null +++ b/http/response/xml/xml_test.go @@ -0,0 +1,83 @@ +// Copyright 2018 Frédéric Guillot. All rights reserved. +// Use of this source code is governed by the Apache 2.0 +// license that can be found in the LICENSE file. + +package xml // import "miniflux.app/http/response/xml" + +import ( + "net/http" + "net/http/httptest" + "testing" +) + +func TestOKResponse(t *testing.T) { + r, err := http.NewRequest("GET", "/", nil) + if err != nil { + t.Fatal(err) + } + + w := httptest.NewRecorder() + + handler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + OK(w, r, "Some XML") + }) + + handler.ServeHTTP(w, r) + resp := w.Result() + + expectedStatusCode := http.StatusOK + if resp.StatusCode != expectedStatusCode { + t.Fatalf(`Unexpected status code, got %d instead of %d`, resp.StatusCode, expectedStatusCode) + } + + expectedBody := `Some XML` + actualBody := w.Body.String() + if actualBody != expectedBody { + t.Fatalf(`Unexpected body, got %s instead of %s`, actualBody, expectedBody) + } + + expectedContentType := "text/xml; charset=utf-8" + actualContentType := resp.Header.Get("Content-Type") + if actualContentType != expectedContentType { + t.Fatalf(`Unexpected content type, got %q instead of %q`, actualContentType, expectedContentType) + } +} + +func TestAttachmentResponse(t *testing.T) { + r, err := http.NewRequest("GET", "/", nil) + if err != nil { + t.Fatal(err) + } + + w := httptest.NewRecorder() + + handler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + Attachment(w, r, "file.xml", "Some XML") + }) + + handler.ServeHTTP(w, r) + resp := w.Result() + + expectedStatusCode := http.StatusOK + if resp.StatusCode != expectedStatusCode { + t.Fatalf(`Unexpected status code, got %d instead of %d`, resp.StatusCode, expectedStatusCode) + } + + expectedBody := `Some XML` + actualBody := w.Body.String() + if actualBody != expectedBody { + t.Fatalf(`Unexpected body, got %s instead of %s`, actualBody, expectedBody) + } + + headers := map[string]string{ + "Content-Type": "text/xml; charset=utf-8", + "Content-Disposition": "attachment; filename=file.xml", + } + + for header, expected := range headers { + actual := resp.Header.Get(header) + if actual != expected { + t.Fatalf(`Unexpected header value, got %q instead of %q`, actual, expected) + } + } +} |