diff options
Diffstat (limited to 'spartan')
-rw-r--r-- | spartan/client.go | 15 |
1 files changed, 13 insertions, 2 deletions
diff --git a/spartan/client.go b/spartan/client.go index d77e791..aff9276 100644 --- a/spartan/client.go +++ b/spartan/client.go @@ -8,6 +8,7 @@ import ( "net" neturl "net/url" "strconv" + "strings" "tildegit.org/tjp/sliderule/internal/types" ) @@ -30,7 +31,10 @@ func NewClient() Client { // single request by default. This can be changed by altering the MaxRedirects field. const DefaultMaxRedirects int = 2 -var ExceededMaxRedirects = errors.New("spartan.Client: exceeded MaxRedirects") +var ( + ErrExceededMaxRedirects = errors.New("spartan.Client: exceeded MaxRedirects") + ErrInvalidRequest = errors.New("spartan.Client: request is invalid") +) // RoundTrip sends a single spartan request and returns its response. func (c Client) RoundTrip(ctx context.Context, request *types.Request) (*types.Response, error) { @@ -64,6 +68,13 @@ func (c Client) RoundTrip(ctx context.Context, request *types.Request) (*types.R } } + if request.Path == "" { + request.Path = "/" + } + if !strings.HasPrefix(request.Path, "/") { + return nil, ErrInvalidRequest + } + requestLine := host + " " + request.EscapedPath() + " " + strconv.Itoa(int(rdr.N)) + "\r\n" if _, err := conn.Write([]byte(requestLine)); err != nil { @@ -114,7 +125,7 @@ func (c Client) Fetch(ctx context.Context, url string) (*types.Response, error) u = prev.ResolveReference(u) } - return nil, ExceededMaxRedirects + return nil, ErrExceededMaxRedirects } func (c Client) IsRedirect(response *types.Response) bool { |