Skip to content

Commit

Permalink
Merge pull request #126 from fakefloordiv/master
Browse files Browse the repository at this point in the history
Fix bug, when mutators would be called twice on error
  • Loading branch information
flrdv authored Jan 16, 2024
2 parents c8a95ed + 24b74a3 commit 0fa40ca
Show file tree
Hide file tree
Showing 11 changed files with 64 additions and 36 deletions.
1 change: 0 additions & 1 deletion http/status/errors.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,6 @@ var (

ErrBadRequest = NewError(BadRequest, "bad request")
ErrTooLongRequestLine = NewError(BadRequest, "request line is too long")
ErrTooLongResponseLine = NewError(BadRequest, "response line is too long")
ErrURIDecoding = NewError(BadRequest, "invalid URI encoding")
ErrBadQuery = NewError(BadRequest, "bad URL query")
ErrNotFound = NewError(NotFound, "not found")
Expand Down
4 changes: 2 additions & 2 deletions internal/initialize/initializers.go
Original file line number Diff line number Diff line change
Expand Up @@ -61,8 +61,8 @@ func NewTransport(s settings.Settings, req *http.Request) transport.Transport {

return http1.New(
req,
*keyBuff, *valBuff, *startLineBuff,
*objPool,
keyBuff, valBuff, startLineBuff,
objPool,
s.Headers,
respBuff,
s.HTTP.FileBuffSize,
Expand Down
15 changes: 7 additions & 8 deletions internal/stash/reader.go
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
package stash

type Retriever interface {
Retrieve() ([]byte, error)
}
type Retriever func() ([]byte, error)

// Reader covers Source function in the manner, so it implements the io.Reader
type Reader struct {
Expand All @@ -11,8 +9,10 @@ type Reader struct {
error error
}

func New() *Reader {
return new(Reader)
func New(source Retriever) *Reader {
return &Reader{
source: source,
}
}

func (r *Reader) Read(b []byte) (n int, err error) {
Expand All @@ -31,11 +31,10 @@ func (r *Reader) Read(b []byte) (n int, err error) {
}

func (r *Reader) refill() {
r.pending, r.error = r.source.Retrieve()
r.pending, r.error = r.source()
}

func (r *Reader) Reset(src Retriever) {
r.source = src
func (r *Reader) Reset() {
r.pending = nil
r.error = nil
}
8 changes: 2 additions & 6 deletions internal/stash/reader_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,7 @@ func (r retriever) Retrieve() ([]byte, error) {

func TestReader(t *testing.T) {
t.Run("both data and error simultaneously", func(t *testing.T) {
r := New()
r.Reset(retriever{"hello, world"})

r := New(retriever{"hello, world"}.Retrieve)
buff := make([]byte, 64)
n, err := r.Read(buff)
require.Equal(t, 12, n)
Expand All @@ -27,9 +25,7 @@ func TestReader(t *testing.T) {
})

t.Run("multiple reads", func(t *testing.T) {
r := New()
r.Reset(retriever{"hello, world"})

r := New(retriever{"hello, world"}.Retrieve)
buff := make([]byte, 2)
data, err := readfull(r, buff)
require.NoError(t, err)
Expand Down
8 changes: 5 additions & 3 deletions internal/transport/http1/body.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,11 +27,13 @@ type Body struct {
func NewBody(
client tcp.Client, chunkedParser *chunkedbody.Parser, s settings.Body,
) *Body {
return &Body{
Reader: stash.New(),
body := &Body{
plain: newPlainBodyReader(client, s.MaxSize),
chunked: newChunkedBodyReader(client, s.MaxSize, chunkedParser),
}
body.Reader = stash.New(body.Retrieve)

return body
}

func (b *Body) Init(request *http.Request) {
Expand All @@ -44,7 +46,7 @@ func (b *Body) Init(request *http.Request) {
}

b.eof = false
b.Reader.Reset(b)
b.Reader.Reset()
}

func (b *Body) String() (string, error) {
Expand Down
16 changes: 8 additions & 8 deletions internal/transport/http1/parser.go
Original file line number Diff line number Diff line change
Expand Up @@ -37,28 +37,28 @@ const (
// the pending data as an extra. Body must be processed separately
type Parser struct {
request *http.Request
startLineBuff buffer.Buffer
startLineBuff *buffer.Buffer
encToksBuff []string
contEncToksBuff []string
headerKey string
headersValuesPool pool.ObjectPool[[]string]
headerKeyBuff buffer.Buffer
headerValueBuff buffer.Buffer
headersSettings settings.Headers
headersValuesPool *pool.ObjectPool[[]string]
headerKeyBuff *buffer.Buffer
headerValueBuff *buffer.Buffer
headersSettings *settings.Headers
headersNumber int
contentLength int
urlEncodedChar uint8
state parserState
}

func NewParser(
request *http.Request, keyBuff, valBuff, startLineBuff buffer.Buffer,
valuesPool pool.ObjectPool[[]string], headersSettings settings.Headers,
request *http.Request, keyBuff, valBuff, startLineBuff *buffer.Buffer,
valuesPool *pool.ObjectPool[[]string], headersSettings settings.Headers,
) *Parser {
return &Parser{
state: eMethod,
request: request,
headersSettings: headersSettings,
headersSettings: &headersSettings,
startLineBuff: startLineBuff,
encToksBuff: make([]string, 0, headersSettings.MaxEncodingTokens),
contEncToksBuff: make([]string, 0, headersSettings.MaxEncodingTokens),
Expand Down
4 changes: 2 additions & 2 deletions internal/transport/http1/parser_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -46,8 +46,8 @@ func getParser() (*Parser, *http.Request) {
respBuff := make([]byte, 0, s.HTTP.ResponseBuffSize)
parser := New(
request,
*keyBuff, *valBuff, *startLineBuff,
*objPool,
keyBuff, valBuff, startLineBuff,
objPool,
s.Headers,
respBuff,
s.HTTP.FileBuffSize,
Expand Down
4 changes: 2 additions & 2 deletions internal/transport/http1/transport.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,8 @@ type Transport struct {

func New(
request *http.Request,
keyBuff, valBuff, startLineBuff buffer.Buffer,
valuesPool pool.ObjectPool[[]string],
keyBuff, valBuff, startLineBuff *buffer.Buffer,
valuesPool *pool.ObjectPool[[]string],
headersSettings settings.Headers,
respBuff []byte,
respFileBuffSize int,
Expand Down
6 changes: 3 additions & 3 deletions router/inbuilt/inbuilt.go
Original file line number Diff line number Diff line change
Expand Up @@ -83,15 +83,15 @@ func (r *Router) onRequest(request *http.Request) *http.Response {
if r.isStatic {
endpoint, found := r.routesMap[request.Path]
if !found {
return r.OnError(request, status.ErrNotFound)
return r.onError(request, status.ErrNotFound)
}

methodsMap = endpoint.methodsMap
request.Env.AllowMethods = endpoint.allow
} else {
endpoint := r.tree.Match(request.Path, request.Params)
if endpoint == nil {
return r.OnError(request, status.ErrNotFound)
return r.onError(request, status.ErrNotFound)
}

methodsMap = endpoint.MethodsMap
Expand All @@ -100,7 +100,7 @@ func (r *Router) onRequest(request *http.Request) *http.Response {

handler := getHandler(request.Method, methodsMap)
if handler == nil {
return r.OnError(request, status.ErrMethodNotAllowed)
return r.onError(request, status.ErrMethodNotAllowed)
}

return handler(request)
Expand Down
32 changes: 32 additions & 0 deletions router/inbuilt/inbuilt_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,9 @@ package inbuilt

import (
"errors"
"github.com/indigo-web/indigo/internal/initialize"
"github.com/indigo-web/indigo/internal/server/tcp/dummy"
"github.com/indigo-web/indigo/settings"
"github.com/stretchr/testify/assert"
"testing"

Expand Down Expand Up @@ -351,3 +354,32 @@ func TestCatchers(t *testing.T) {
require.Equal(t, "double magic", string(resp.Reveal().Body))
})
}

func TestMutators(t *testing.T) {
var timesCalled int

r := New().
Get("/", http.Respond).
Mutator(func(request *http.Request) {
timesCalled++
})

require.NoError(t, r.OnStart())
request := initialize.NewRequest(settings.Default(), dummy.NewNopConn(), nil)
request.Method = method.GET
request.Path = "/"
resp := r.OnRequest(request)
require.Equal(t, status.OK, resp.Reveal().Code)

request.Method = method.POST
request.Path = "/"
resp = r.OnRequest(request)
require.Equal(t, status.MethodNotAllowed, resp.Reveal().Code)

request.Method = method.GET
request.Path = "/foo"
resp = r.OnRequest(request)
require.Equal(t, status.NotFound, resp.Reveal().Code)

require.Equal(t, 3, timesCalled)
}
2 changes: 1 addition & 1 deletion version
Original file line number Diff line number Diff line change
@@ -1 +1 @@
0.15.5
0.15.6

0 comments on commit 0fa40ca

Please sign in to comment.