Added Reader and String

This commit is contained in:
Eduard Urbach 2023-07-19 13:01:51 +02:00
parent 10d6d51294
commit 7da8fffb90
Signed by: akyoto
GPG Key ID: C874F672B1AF20C0
2 changed files with 27 additions and 0 deletions

View File

@ -1,7 +1,9 @@
package server package server
import ( import (
"io"
"net/http" "net/http"
"unsafe"
) )
// maxParams defines the maximum number of parameters per route. // maxParams defines the maximum number of parameters per route.
@ -11,6 +13,8 @@ const maxParams = 16
type Context interface { type Context interface {
Bytes([]byte) error Bytes([]byte) error
Error(int, error) error Error(int, error) error
Reader(io.Reader) error
String(string) error
} }
// context represents a request & response context. // context represents a request & response context.
@ -43,6 +47,18 @@ func (ctx *context) Error(status int, err error) error {
return err return err
} }
// Reader sends the contents of the io.Reader without creating an in-memory copy.
func (ctx *context) Reader(reader io.Reader) error {
_, err := io.Copy(ctx.response, reader)
return err
}
// String responds with the given string.
func (ctx *context) String(body string) error {
slice := unsafe.Slice(unsafe.StringData(body), len(body))
return ctx.Bytes(slice)
}
// addParameter adds a new parameter to the context. // addParameter adds a new parameter to the context.
func (ctx *context) addParameter(name string, value string) { func (ctx *context) addParameter(name string, value string) {
ctx.paramNames[ctx.paramCount] = name ctx.paramNames[ctx.paramCount] = name

View File

@ -5,6 +5,7 @@ import (
"io" "io"
"net/http" "net/http"
"net/http/httptest" "net/http/httptest"
"strings"
"testing" "testing"
"git.akyoto.dev/go/assert" "git.akyoto.dev/go/assert"
@ -26,6 +27,14 @@ func TestRouter(t *testing.T) {
return ctx.Error(http.StatusUnauthorized, errors.New("Not logged in")) return ctx.Error(http.StatusUnauthorized, errors.New("Not logged in"))
}) })
s.Get("/reader", func(ctx server.Context) error {
return ctx.Reader(strings.NewReader("Hello"))
})
s.Get("/string", func(ctx server.Context) error {
return ctx.String("Hello")
})
tests := []struct { tests := []struct {
URL string URL string
Status int Status int
@ -35,6 +44,8 @@ func TestRouter(t *testing.T) {
{URL: "/blog/post", Status: http.StatusOK, Body: "Hello"}, {URL: "/blog/post", Status: http.StatusOK, Body: "Hello"},
{URL: "/error", Status: http.StatusUnauthorized, Body: "Not logged in"}, {URL: "/error", Status: http.StatusUnauthorized, Body: "Not logged in"},
{URL: "/not-found", Status: http.StatusNotFound, Body: http.StatusText(http.StatusNotFound)}, {URL: "/not-found", Status: http.StatusNotFound, Body: http.StatusText(http.StatusNotFound)},
{URL: "/reader", Status: http.StatusOK, Body: "Hello"},
{URL: "/string", Status: http.StatusOK, Body: "Hello"},
} }
for _, test := range tests { for _, test := range tests {