/
content_encoding_content_media_type.ex
47 lines (37 loc) · 1.38 KB
/
content_encoding_content_media_type.ex
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
defmodule ExJsonSchema.Validator.ContentEncodingContentMediaType do
@moduledoc """
`ExJsonSchema.Validator` implementation for `"contentEncoding"` and `"contentMediaType"` attributes.
See:
https://tools.ietf.org/html/draft-handrews-json-schema-validation-01#section-8.3
"""
alias ExJsonSchema.Validator.Error
@behaviour ExJsonSchema.Validator
@impl ExJsonSchema.Validator
def validate(%{version: version}, schema, {"contentEncoding", content_encoding}, data, _)
when version >= 7 do
{errors, data} = validate_content_encoding(content_encoding, data)
validate_content_media_type(schema, data, errors)
end
def validate(_, _, _, _, _) do
[]
end
defp validate_content_encoding("base64", data) when is_bitstring(data) do
case Base.decode64(data) do
{:ok, decoded_data} -> {[], decoded_data}
:error -> {[%Error{error: %Error.ContentEncoding{expected: "base64"}}], data}
end
end
defp validate_content_encoding(_, data) do
{[], data}
end
defp validate_content_media_type(%{"contentMediaType" => "application/json"}, data, errors)
when is_bitstring(data) do
case ExJsonSchema.Schema.decode_json(data) do
{:ok, _} ->
errors
{:error, _} ->
errors ++ [%Error{error: %Error.ContentMediaType{expected: "application/json"}}]
end
end
defp validate_content_media_type(_, _, errors), do: errors
end