@@ -150,7 +150,8 @@ defmodule URI do
150150 scheme_specific( scheme, info)
151151 end
152152
153- defp scheme_specific ( scheme , info ) do
153+ @doc false
154+ def scheme_module ( scheme ) do
154155 if scheme do
155156 module =
156157 try do
@@ -160,10 +161,14 @@ defmodule URI do
160161 end
161162
162163 if module && Code . ensure_loaded? ( module ) do
163- module . parse ( default_port ( info , module ) )
164- else
165- info
164+ module
166165 end
166+ end
167+ end
168+
169+ defp scheme_specific( scheme, info) do
170+ if module = scheme_module ( scheme ) do
171+ module . parse ( default_port ( info , module ) )
167172 else
168173 info
169174 end
@@ -202,3 +207,22 @@ defmodule URI do
202207 :ok
203208 end
204209end
210+
211+ defimpl Binary. Chars , for: URI.Info do
212+ def to_binary ( uri ) do
213+ result = ""
214+
215+ if module = URI . scheme_module ( uri . scheme ) do
216+ if module . default_port == uri . port , do: uri = uri . port ( nil )
217+ end
218+
219+ if uri . scheme , do: result = result <> uri . scheme <> "://"
220+ if uri . userinfo , do: result = result <> uri . userinfo <> "@"
221+ if uri . host , do: result = result <> uri . host
222+ if uri . port , do: result = result <> ":" <> integer_to_binary ( uri . port )
223+ if uri . query , do: result = result <> "?" <> uri . query
224+ if uri . fragment , do: result = result <> "#" <> uri . fragment
225+
226+ result
227+ end
228+ end
0 commit comments