Skip to content

Commit

Permalink
Allow Conn.new/2 to take a url string
Browse files Browse the repository at this point in the history
  • Loading branch information
Azolo committed Nov 24, 2017
1 parent ebc53c7 commit 6d2b68b
Show file tree
Hide file tree
Showing 3 changed files with 37 additions and 16 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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!

Expand Down
12 changes: 10 additions & 2 deletions lib/websockex/conn.ex
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -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
Expand Down
40 changes: 26 additions & 14 deletions test/websockex/conn_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand All @@ -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
Expand Down

0 comments on commit 6d2b68b

Please sign in to comment.