elm / http

Make HTTP requests in Elm
https://package.elm-lang.org/packages/elm/http/latest
BSD 3-Clause "New" or "Revised" License
155 stars 46 forks source link

Uncaught TypeError: Failed to execute 'setRequestHeader' on 'XMLHttpRequest': Value is not a valid ByteString #70

Open decioferreira opened 4 years ago

decioferreira commented 4 years ago

SSCCE

module Main exposing (main)

import Browser
import Html exposing (text)
import Http

main : Program () () ()
main =
    Browser.element
        { init =
            \_ ->
                ( ()
                , Http.request
                    { method = "GET"
                    , headers = [ Http.header "foo" "âçéÿ€èëïîôœæâà" ]
                    , url = "https://www.example.com"
                    , body = Http.emptyBody
                    , expect = Http.expectWhatever (always ())
                    , timeout = Nothing
                    , tracker = Nothing
                    }
                )
        , view = \_ -> text ""
        , update = \_ model -> ( model, Cmd.none )
        , subscriptions = \_ -> Sub.none
        }

Link to ellie: https://ellie-app.com/8KGdFZz6j7qa1

Problem

When adding a HTTP header value with non UTF-8 characters we see the following error:

Uncaught TypeError: Failed to execute 'setRequestHeader' on 'XMLHttpRequest': Value is not a valid ByteString

HTTP headers can only contain UTF-8 Strings (see ByteString).

This might relate to #53.

Workaround

Use Url.percentEncode to encode the value.

module Main exposing (main)

import Browser
import Html exposing (text)
import Http
import Url

main : Program () () ()
main =
    Browser.element
        { init =
            \_ ->
                ( ()
                , Http.request
                    { method = "GET"
                    , headers = [ Http.header "foo" (Url.percentEncode "âçéÿ€èëïîôœæâà") ]
                    , url = "https://www.example.com"
                    , body = Http.emptyBody
                    , expect = Http.expectWhatever (always ())
                    , timeout = Nothing
                    , tracker = Nothing
                    }
                )
        , view = \_ -> text ""
        , update = \_ model -> ( model, Cmd.none )
        , subscriptions = \_ -> Sub.none
        }

Link to ellie: https://ellie-app.com/8KJ2mmzRZgPa1