Skip to content

Commit 1437736

Browse files
committed
chore: catch the encoder exception to avoid crashing the connection process
1 parent 972de9c commit 1437736

File tree

6 files changed

+33
-9
lines changed

6 files changed

+33
-9
lines changed

lib/bson.ex

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,11 @@ defmodule BSON do
1212
@spec encode(document) :: iodata
1313
def encode(map) when is_map(map) do
1414
case Map.has_key?(map, :__struct__) do
15-
true -> BSON.Encoder.encode(Map.to_list(map))
16-
false -> BSON.Encoder.encode(map)
15+
true ->
16+
BSON.Encoder.encode(Map.to_list(map))
17+
18+
false ->
19+
BSON.Encoder.encode(map)
1720
end
1821
end
1922

@@ -26,7 +29,8 @@ defmodule BSON do
2629
"""
2730
@spec decode(iodata) :: document
2831
def decode(iodata) do
29-
IO.iodata_to_binary(iodata)
32+
iodata
33+
|> IO.iodata_to_binary()
3034
|> BSON.Decoder.decode()
3135
end
3236
end

lib/bson/encoder.ex

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,8 @@ defmodule BSON.Encoder do
6464
end
6565

6666
def encode(value) when is_list(value) do
67-
array(value, 0)
67+
value
68+
|> array(0)
6869
|> document
6970
end
7071

@@ -95,6 +96,10 @@ defmodule BSON.Encoder do
9596
def encode(value) when is_int64(value),
9697
do: <<value::int64>>
9798

99+
def encode(value) do
100+
raise Mongo.Error.exception("invalid document: #{inspect(value)}")
101+
end
102+
98103
def document(doc) do
99104
{_, iodata} =
100105
Enum.reduce(doc, {:unknown, ""}, fn
@@ -141,8 +146,7 @@ defmodule BSON.Encoder do
141146
do: [{Integer.to_string(ix), hd} | array(tl, ix + 1)]
142147

143148
defp invalid_doc(doc) do
144-
message = "invalid document containing atom and string keys: #{inspect(doc)}"
145-
raise ArgumentError, message
149+
raise Mongo.Error.exception("invalid document containing atom and string keys: #{inspect(doc)}")
146150
end
147151

148152
defp type(%BSON.Binary{}), do: @type_binary

lib/mongo_db_connection/utils.ex

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,10 @@ defmodule Mongo.MongoDBConnection.Utils do
2121
{:ok, ^id, response} <- recv_data(nil, "", state) do
2222
get_doc(response)
2323
end
24+
rescue
25+
error ->
26+
Logger.error("Unable to send request to database because of #{inspect(error)}")
27+
{:error, error, state}
2428
end
2529

2630
@doc """

test/bson/encoder_test.exs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
defmodule BSON.EncoderTest do
2+
use ExUnit.Case, async: true
3+
4+
test "return error in the case of encoder issues" do
5+
assert_raise Mongo.Error, fn -> %{message: "invalid document: {:error, \"some error\"}"} = BSON.encode(%{"field" => {:error, "some error"}}) end
6+
end
7+
end

test/bson_test.exs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -204,11 +204,11 @@ defmodule BSONTest do
204204

205205
test "mixing atoms with binaries" do
206206
document = 1..33 |> Enum.reduce(%{}, fn x, acc -> Map.put(acc, to_string(x), x) end) |> Map.put(:a, 10)
207-
assert_raise ArgumentError, fn -> encode(document) end
207+
assert_raise Mongo.Error, fn -> encode(document) end
208208
document = %{:key => "value", "id" => 10}
209-
assert_raise ArgumentError, fn -> encode(document) end
209+
assert_raise Mongo.Error, fn -> encode(document) end
210210
document = 1..33 |> Enum.reduce(%{}, fn x, acc -> Map.put(acc, to_string(x), x) end) |> Map.put(:__struct__, TestUser)
211-
assert_raise ArgumentError, fn -> encode(document) end
211+
assert_raise Mongo.Error, fn -> encode(document) end
212212
end
213213

214214
defp encode(value) do

test/mongo/encoder_test.exs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,11 @@ defmodule Mongo.EncoderTest do
3737
end
3838
end
3939

40+
test "invalid document test", c do
41+
coll = unique_collection()
42+
assert {:error, %Mongo.Error{message: "invalid document: {:error, \"some error\"}"}} = Mongo.insert_one(c.pid, coll, %{"field" => {:error, "some error"}})
43+
end
44+
4045
test "insert encoded date with protocol", c do
4146
coll = unique_collection()
4247

0 commit comments

Comments
 (0)