diff --git a/http/io.go b/http/io.go new file mode 100644 index 0000000..e6eb562 --- /dev/null +++ b/http/io.go @@ -0,0 +1,30 @@ +// Package that provides the logic of the webserver +package http + +import ( + "encoding/json" + "errors" + "net/http" + "strings" +) + +// Function to read data from a http request via json format (input) +func Read(r *http.Request, to interface{}) (err error) { + if !strings.Contains(r.Header.Get("Content-Type"), "application/json") { + err = errors.New("no json request recieved") + return + } + err = json.NewDecoder(r.Body).Decode(to) + return +} + +// Function to write data as json to a http response (output) +func Write(w http.ResponseWriter, data interface{}) { + js, err := json.Marshal(data) + if err != nil { + http.Error(w, "failed to encode response: "+err.Error(), http.StatusInternalServerError) + return + } + w.Header().Set("Content-Type", "application/json") + w.Write(js) +} diff --git a/http/io_test.go b/http/io_test.go new file mode 100644 index 0000000..e0811d5 --- /dev/null +++ b/http/io_test.go @@ -0,0 +1,53 @@ +// Package that provides the logic of the webserver +package http + +import ( + "bytes" + "net/http" + "net/http/httptest" + "strings" + "testing" + + "github.com/stretchr/testify/assert" +) + +// Function to test write() +func TestWrite(t *testing.T) { + assert := assert.New(t) + + w := httptest.NewRecorder() + from := map[string]string{"a": "b"} + Write(w, from) + result := w.Result() + + assert.Equal([]string{"application/json"}, result.Header["Content-Type"], "no header information") + buf := new(bytes.Buffer) + buf.ReadFrom(result.Body) + to := buf.String() + assert.Equal("{\"a\":\"b\"}", to, "wrong content") + + w = httptest.NewRecorder() + value := make(chan int) + Write(w, value) + result = w.Result() + + assert.Equal(http.StatusInternalServerError, result.StatusCode, "wrong statuscode") + +} + +// Function to test read() +func TestRead(t *testing.T) { + assert := assert.New(t) + + to := make(map[string]string) + r, _ := http.NewRequest("GET", "/a", strings.NewReader("{\"a\":\"b\"}")) + + r.Header["Content-Type"] = []string{"application/json"} + err := Read(r, &to) + assert.NoError(err, "no error") + assert.Equal(map[string]string{"a": "b"}, to, "wrong content") + + r.Header["Content-Type"] = []string{""} + err = Read(r, &to) + assert.Error(err, "no error") +}