Packages

A RFC 2397 URI parser for Elixir

Current section

3 Versions

Jump to

Compare versions

4 files changed
+50 additions
-39 deletions
  @@ -0,0 +1,13 @@
1 + Changelog
2 + =========
3 +
4 + 0.2.0
5 + -----
6 +
7 + * Fix compilation warning on Elixir 1.3
8 + * Require Elixir ~> 1.3
9 +
10 + 0.1.0
11 + -----
12 +
13 + First release
  @@ -1,11 +1,11 @@
1 1 {<<"app">>,<<"exdatauri">>}.
2 2 {<<"build_tools">>,[<<"mix">>]}.
3 - {<<"contributors">>,[<<"Luper Rouch">>]}.
4 3 {<<"description">>,<<"A RFC 2397 URI parser for Elixir">>}.
5 - {<<"elixir">>,<<"~> 1.0">>}.
6 - {<<"files">>,[<<"lib/exdatauri.ex">>,<<"mix.exs">>,<<"README.md">>]}.
4 + {<<"elixir">>,<<"~> 1.3">>}.
5 + {<<"files">>,
6 + [<<"lib/exdatauri.ex">>,<<"mix.exs">>,<<"README.md">>,<<"CHANGELOG.md">>]}.
7 7 {<<"licenses">>,[<<"MIT">>]}.
8 8 {<<"links">>,[{<<"Github">>,<<"https://github.com/flupke/exdatauri">>}]}.
9 9 {<<"name">>,<<"exdatauri">>}.
10 10 {<<"requirements">>,[]}.
11 - {<<"version">>,<<"0.1.0">>}.
11 + {<<"version">>,<<"0.2.0">>}.
  @@ -30,41 +30,36 @@ defmodule ExDataURI do
30 30 charset \\ nil,
31 31 payload_encoding \\ :base64,
32 32 input_charset \\ "utf8") do
33 - error = nil
33 + with {:ok, payload, charset_meta} <- convert_charset(payload, input_charset, charset),
34 + {:ok, payload, payload_meta} <- encode_payload(payload, payload_encoding) do
35 + {:ok, "data:#{mediatype}#{charset_meta}#{payload_meta},#{payload}"}
36 + end
37 + end
34 38
39 + defp convert_charset(payload, input_charset, charset) do
35 40 case charset do
36 41 nil ->
37 - charset_meta = ""
42 + {:ok, payload, ""}
38 43 ^input_charset ->
39 - charset_meta = ";charset=#{charset}"
44 + {:ok, payload, ";charset=#{charset}"}
40 45 charset ->
41 46 case :iconverl.conv(charset, input_charset, payload) do
42 - {:ok, payload} ->
43 - payload = payload
44 - charset_meta = ";charset=#{charset}"
47 + {:ok, converted_payload} ->
48 + {:ok, converted_payload, ";charset=#{charset}"}
45 49 {:error, reason} ->
46 - error = {:error, "failed encoding payload from #{inspect input_charset} to #{inspect charset}: #{inspect reason}"}
50 + {:error, "failed encoding payload from #{inspect input_charset} to #{inspect charset}: #{inspect reason}"}
47 51 end
48 52 end
53 + end
49 54
50 - unless error do
51 - case payload_encoding do
52 - :base64 ->
53 - payload_meta = ";base64"
54 - payload = Base.encode64(payload)
55 - :urlenc ->
56 - payload_meta = ""
57 - payload = URI.encode(payload)
58 - _unknonw_enc ->
59 - error = {:error, "unknown payload encoding: #{inspect payload_encoding}"}
60 - end
61 - end
62 -
63 - case error do
64 - nil ->
65 - {:ok, "data:#{mediatype}#{charset_meta}#{payload_meta},#{payload}"}
66 - error ->
67 - error
55 + defp encode_payload(payload, payload_encoding) do
56 + case payload_encoding do
57 + :base64 ->
58 + {:ok, Base.encode64(payload), ";base64"}
59 + :urlenc ->
60 + {:ok, URI.encode(payload), ""}
61 + _unknonw_enc ->
62 + {:error, "unknown payload encoding: #{inspect payload_encoding}"}
68 63 end
69 64 end
70 65
  @@ -73,7 +68,7 @@ defmodule ExDataURI do
73 68
74 69 Return values:
75 70 * `{:ok, mediatype, data}` - where `mediatype` is the one given in the
76 - metadata, or "text/plain" if it's omitted;
71 + metadata, or `"text/plain"` if it's omitted;
77 72 * `{:error, reason}`
78 73 """
79 74 @spec parse(String.t) :: {:ok | :error, String.t}
  @@ -103,20 +98,23 @@ defmodule ExDataURI do
103 98 Only parse metadata of an RFC 2397 URI.
104 99
105 100 Return values:
106 - * `{:ok, mediatype, charset, payload_encoding}`
101 + * `{:ok, mediatype, charset, payload_encoding}` - where `mediatype` is the
102 + MIME type (`"text/plain"` by default), `charset` the encoding of the
103 + payload or `nil`, and `payload_encoding` is one of `:urlenc` or `:base64`
107 104 * `{:error, reason}`
108 105 """
106 + @spec parse_metadata(String.t) :: {:ok, String.t, String.t | nil, :atom} | {:error, String.t}
109 107 def parse_metadata("data:" <> rest) do
110 108 [metadata, _payload] = String.split(rest, ",", parts: 2)
111 109 parse_metadata(metadata)
112 110 end
113 111 def parse_metadata(metadata) do
114 - if String.ends_with?(metadata, ";base64") do
115 - metadata = String.slice(metadata, 0..-8)
116 - payload_encoding = :base64
117 - else
118 - payload_encoding = :urlenc
119 - end
112 + {metadata, payload_encoding} =
113 + if String.ends_with?(metadata, ";base64") do
114 + {String.slice(metadata, 0..-8), :base64}
115 + else
116 + {metadata, :urlenc}
117 + end
120 118 case parse_mediatype(metadata) do
121 119 {:ok, mediatype, charset} ->
122 120 {:ok, mediatype, charset, payload_encoding}
  @@ -4,9 +4,9 @@ defmodule ExDataURI.Mixfile do
4 4 def project do
5 5 [
6 6 app: :exdatauri,
7 - version: "0.1.0",
7 + version: "0.2.0",
8 8 description: "A RFC 2397 URI parser for Elixir",
9 - elixir: "~> 1.0",
9 + elixir: "~> 1.3",
10 10 build_embedded: Mix.env == :prod,
11 11 start_permanent: Mix.env == :prod,
12 12 deps: deps,