"syscall/js"
)
+// jsFetchMode is a Request.Header map key that, if present,
+// signals that the map entry is actually an option to the Fetch API mode setting.
+// Valid values are: "cors", "no-cors", "same-origin", "navigate"
+// The default is "same-origin".
+//
+// Reference: https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch#Parameters
+const jsFetchMode = "js.fetch:mode"
+
+// jsFetchCreds is a Request.Header map key that, if present,
+// signals that the map entry is actually an option to the Fetch API credentials setting.
+// Valid values are: "omit", "same-origin", "include"
+// The default is "same-origin".
+//
+// Reference: https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch#Parameters
+const jsFetchCreds = "js.fetch:credentials"
+
// RoundTrip implements the RoundTripper interface using the WHATWG Fetch API.
func (t *Transport) RoundTrip(req *Request) (*Response, error) {
if useFakeNetwork() {
return t.roundTrip(req)
}
- headers := js.Global().Get("Headers").New()
- for key, values := range req.Header {
- for _, value := range values {
- headers.Call("append", key, value)
- }
- }
ac := js.Global().Get("AbortController")
if ac != js.Undefined() {
opt := js.Global().Get("Object").New()
// See https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch
// for options available.
- opt.Set("headers", headers)
opt.Set("method", req.Method)
opt.Set("credentials", "same-origin")
+ if h := req.Header.Get(jsFetchCreds); h != "" {
+ opt.Set("credentials", h)
+ req.Header.Del(jsFetchCreds)
+ }
+ if h := req.Header.Get(jsFetchMode); h != "" {
+ opt.Set("mode", h)
+ req.Header.Del(jsFetchMode)
+ }
if ac != js.Undefined() {
opt.Set("signal", ac.Get("signal"))
}
+ headers := js.Global().Get("Headers").New()
+ for key, values := range req.Header {
+ for _, value := range values {
+ headers.Call("append", key, value)
+ }
+ }
+ opt.Set("headers", headers)
if req.Body != nil {
// TODO(johanbrandhorst): Stream request body when possible.