diff --git a/CHANGELOG.md b/CHANGELOG.md index 85af92c..a4372fd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ handling for `cast/2` and `send_frame/2`. - Add access to response headers during `handle_connect/2` via `Conn.resp_headers`. - Add `Conn.parse_url/1` to handle url to URI conversion. +- Allow `Conn.new/2` to use a url string instead of a `URI` struct. - Automatically add a "/" path to a pathless url. - The HTTP request will break without a valid path! diff --git a/lib/websockex/conn.ex b/lib/websockex/conn.ex index 37328be..0658bf1 100644 --- a/lib/websockex/conn.ex +++ b/lib/websockex/conn.ex @@ -69,8 +69,10 @@ defmodule WebSockex.Conn do @doc """ Returns a new `WebSockex.Conn` struct from a uri and options. """ - @spec new(URI.t, [connection_option]) :: __MODULE__.t - def new(uri, opts \\ []) do + @spec new(url :: String.t | URI.t, [connection_option]) :: + __MODULE__.t | {:error, %WebSockex.URLError{}} + def new(url, opts \\ []) + def new(%URI{} = uri, opts) do mod = conn_module(uri.scheme) %WebSockex.Conn{host: uri.host, @@ -85,6 +87,12 @@ defmodule WebSockex.Conn do socket_connect_timeout: Keyword.get(opts, :socket_connect_timeout, @socket_connect_timeout_default), socket_recv_timeout: Keyword.get(opts, :socket_recv_timeout, @socket_recv_timeout_default)} end + def new(url, opts) do + case parse_url(url) do + {:ok, %URI{} = uri} -> new(uri, opts) + {:error, _} = error -> error + end + end @doc """ Parses a url string for a valid URI diff --git a/test/websockex/conn_test.exs b/test/websockex/conn_test.exs index 1d3eb7d..bc005fd 100644 --- a/test/websockex/conn_test.exs +++ b/test/websockex/conn_test.exs @@ -40,26 +40,37 @@ defmodule WebSockex.ConnTest do socket_connect_timeout: 6000, socket_recv_timeout: 5000} - regular_uri = URI.parse("ws://localhost/ws") - assert WebSockex.Conn.new(regular_uri, - extra_headers: [{"Pineapple", "Cake"}], - socket_connect_timeout: 123, - socket_recv_timeout: 456) == - %{tcp_conn | socket_connect_timeout: 123, socket_recv_timeout: 456} + regular_url = "ws://localhost/ws" + regular_uri = URI.parse(regular_url) + regular_opts = [ + extra_headers: [{"Pineapple", "Cake"}], + socket_connect_timeout: 123, + socket_recv_timeout: 456\ + ] - ssl_uri = URI.parse("wss://localhost/ws") - assert WebSockex.Conn.new(ssl_uri, extra_headers: [{"Pineapple", "Cake"}]) == ssl_conn + assert WebSockex.Conn.new(regular_uri, regular_opts) == %{tcp_conn | socket_connect_timeout: 123, socket_recv_timeout: 456} + assert WebSockex.Conn.new(regular_url, regular_opts) == WebSockex.Conn.new(regular_uri, regular_opts) - http_uri = URI.parse("http://localhost/ws") - assert WebSockex.Conn.new(http_uri, extra_headers: [{"Pineapple", "Cake"}]) == tcp_conn + conn_opts = [extra_headers: [{"Pineapple", "Cake"}]] + ssl_url = "wss://localhost/ws" + ssl_uri = URI.parse(ssl_url) + assert WebSockex.Conn.new(ssl_uri, conn_opts) == ssl_conn + assert WebSockex.Conn.new(ssl_url, conn_opts) == WebSockex.Conn.new(ssl_uri, conn_opts) - https_uri = URI.parse("https://localhost/ws") - assert WebSockex.Conn.new(https_uri, extra_headers: [{"Pineapple", "Cake"}]) == ssl_conn + http_url = "http://localhost/ws" + http_uri = URI.parse(http_url) + assert WebSockex.Conn.new(http_uri, conn_opts) == tcp_conn + assert WebSockex.Conn.new(http_url, conn_opts) == WebSockex.Conn.new(http_uri, conn_opts) + https_url = "https://localhost/ws" + https_uri = URI.parse(https_url) + assert WebSockex.Conn.new(https_uri, conn_opts) == ssl_conn + assert WebSockex.Conn.new(https_url, conn_opts) == WebSockex.Conn.new(https_uri, conn_opts) - llama = URI.parse("llama://localhost/ws") - assert WebSockex.Conn.new(llama, extra_headers: [{"Pineapple", "Cake"}]) == + llama_url = "llama://localhost/ws" + llama_conn = URI.parse(llama_url) + assert WebSockex.Conn.new(llama_conn, conn_opts) == %WebSockex.Conn{host: "localhost", port: nil, path: "/ws", @@ -70,6 +81,7 @@ defmodule WebSockex.ConnTest do socket: nil, socket_connect_timeout: 6000, socket_recv_timeout: 5000} + assert {:error, %WebSockex.URLError{}} = WebSockex.Conn.new(llama_url, conn_opts) end test "parse_url" do