Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 14 additions & 9 deletions http/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -158,7 +158,7 @@ func (c *Client) send(req *Request, deadline time.Time) (resp *Response, didTime
req.AddCookie(cookie)
}
}
resp, didTimeout, err = send(req, deadline)
resp, didTimeout, err = send(req, c.transport(), deadline)
if err != nil {
return nil, didTimeout, err
}
Expand All @@ -177,11 +177,16 @@ func (c *Client) deadline() time.Time {
return time.Time{}
}

func (c *Client) transport() RoundTripper {
if c.Transport != nil {
return c.Transport
}
return DefaultTransport
}

// send issues an HTTP request.
// Caller should close resp.Body when done reading from it.
func send(req *Request, deadline time.Time) (resp *Response, didTimeout func() bool, err error) {

// TINYGO: Removed round tripper
func send(req *Request, rt RoundTripper, deadline time.Time) (resp *Response, didTimeout func() bool, err error) {

if req.URL == nil {
req.closeBody()
Expand All @@ -192,6 +197,10 @@ func send(req *Request, deadline time.Time) (resp *Response, didTimeout func() b
req.closeBody()
return nil, alwaysFalse, errors.New("http: Request.RequestURI can't be set in client requests")
}
if rt == nil {
req.closeBody()
return nil, alwaysFalse, errors.New("http: no Client.Transport or DefaultTransport")
}

// TINYGO: Removed forkReq stuff

Expand All @@ -208,7 +217,7 @@ func send(req *Request, deadline time.Time) (resp *Response, didTimeout func() b
req.Header.Set("Authorization", "Basic "+basicAuth(username, password))
}

resp, err = roundTrip(req)
resp, err = rt.RoundTrip(req)
if err != nil {

// TINYGO: Remove TLS error check
Expand Down Expand Up @@ -440,10 +449,6 @@ func urlErrorOp(method string) string {
// Any returned error will be of type [*url.Error]. The url.Error
// value's Timeout method will report true if the request timed out.
func (c *Client) Do(req *Request) (*Response, error) {
if c.Transport != nil {
return c.Transport.RoundTrip(req)
}

return c.do(req)
}

Expand Down
72 changes: 72 additions & 0 deletions http/clienttransport_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
package http

import (
"io"
"strings"
"testing"
)

type recordingTransport struct {
calls int
req *Request
}

func (t *recordingTransport) RoundTrip(req *Request) (*Response, error) {
t.calls++
t.req = req
return &Response{
Status: "200 OK",
StatusCode: 200,
Header: Header{},
Body: io.NopCloser(strings.NewReader("ok")),
Request: req,
}, nil
}

// A client with no Transport must dispatch through DefaultTransport, whose
// RoundTrip is build-tagged: the fetch API on js/wasm, the netdev dial
// elsewhere. Dispatching to the package-level dialer directly is issue #66.
func TestClientUsesDefaultTransport(t *testing.T) {
previous := DefaultTransport
defer func() { DefaultTransport = previous }()
rt := &recordingTransport{}
DefaultTransport = rt

c := &Client{}
resp, err := c.Get("http://example.com/")
if err != nil {
t.Fatal(err)
}
resp.Body.Close()
if rt.calls != 1 {
t.Fatalf("DefaultTransport.RoundTrip calls = %d, want 1", rt.calls)
}
if rt.req.URL.Host != "example.com" {
t.Fatalf("request URL = %v", rt.req.URL)
}
}

func TestClientUsesExplicitTransport(t *testing.T) {
rt := &recordingTransport{}
c := &Client{Transport: rt}
resp, err := c.Get("http://example.com/")
if err != nil {
t.Fatal(err)
}
resp.Body.Close()
if rt.calls != 1 {
t.Fatalf("Transport.RoundTrip calls = %d, want 1", rt.calls)
}
}

func TestClientNoTransport(t *testing.T) {
previous := DefaultTransport
defer func() { DefaultTransport = previous }()
DefaultTransport = nil

c := &Client{}
_, err := c.Get("http://example.com/")
if err == nil || !strings.Contains(err.Error(), "no Client.Transport or DefaultTransport") {
t.Fatalf("error = %v, want no-transport error", err)
}
}