Skip to content

Commit

Permalink
add logger middleware
Browse files Browse the repository at this point in the history
  • Loading branch information
zhongwencool committed Nov 21, 2016
1 parent 6c7c1da commit 94a8b1b
Show file tree
Hide file tree
Showing 4 changed files with 84 additions and 8 deletions.
16 changes: 8 additions & 8 deletions lib/maxwell/middleware/json.ex
Expand Up @@ -13,7 +13,7 @@ defmodule Maxwell.Middleware.Json do
@middleware Maxwell.Middleware.Json
# or
@middleware Maxwell.Middleware.Json, [encode_content_type: "application/json", encode_func: &other_json_lib.encode/1,
decode_content_types: ["yourowntype"], decode_func: &other_json_lib.encode/1]
decode_content_types: ["yourowntype"], decode_func: &other_json_lib.encode/1]
```
"""
use Maxwell.Middleware
Expand All @@ -28,7 +28,7 @@ defmodule Maxwell.Middleware.Json do
end

defmodule Maxwell.Middleware.EncodeJson do
@moduledoc """
@moduledoc """
Encode request's body to json when request's body is not nil
It will auto add `%{'Content-Type': 'application/json'}` to request's headers
Expand All @@ -42,7 +42,7 @@ defmodule Maxwell.Middleware.EncodeJson do
@middleware Maxwell.Middleware.EncodeJson, [encode_content_type: "application/json", encode_func: &other_json_lib.encode/1]
```
"""
use Maxwell.Middleware
use Maxwell.Middleware

def request(env, opts) do
encode_fun = opts[:encode_func] || &Poison.encode/1
Expand All @@ -63,12 +63,12 @@ use Maxwell.Middleware
end

defmodule Maxwell.Middleware.DecodeJson do
@moduledoc """
@moduledoc """
Decode reponse's body to json when
1. Reponse header contain `{'Content-Type', "application/json"}` and body is binary
1. Reponse header contain `{'Content-Type', "application/json"}` and body is binary
2. Reponse is list
2. Reponse is list
Default json_lib is Poison
```ex
Expand All @@ -79,7 +79,7 @@ defmodule Maxwell.Middleware.DecodeJson do
@middleware Maxwell.Middleware.DecodeJson, [decode_content_types: ["text/javascript"], decode_func: &other_json_lib.decode/1]
```
"""
use Maxwell.Middleware
use Maxwell.Middleware

def response(response, opts) do
decode_fun = opts[:decode_func] || &Poison.decode/1
Expand All @@ -98,7 +98,7 @@ use Maxwell.Middleware
end
_ ->
{:ok, result}
end
end
end

end
Expand Down
59 changes: 59 additions & 0 deletions lib/maxwell/middleware/log.ex
@@ -0,0 +1,59 @@
defmodule Maxwell.Middleware.Logger do
@moduledoc """
Log the request
Log the response
```ex
# Client.ex
use Maxwell.Builder ~(get)a
@middleware Maxwell.Middleware.Log
def request do
"/test" |> url |> get!
end
```
"""
use Maxwell.Middleware
require Logger

def request(env, opts) do
"REQUEST: "
|> Kernel.<>(format_message(env))
|> Logger.info
env
end
def response(result, log_fun) do
case result do
{:error, reason} ->
format_reason = :io_lib.format("~p", [reason])
Logger.error("RESPONSE ERROR: " <> format_reason)
{:ok, env} ->
message = "RESPONSE: " <> format_message(env)
cond do
env.status >= 400 -> Logger.error message
env.status >= 300 -> Logger.warn message
true -> Logger.info message
end
end
result
end

defp format_message(env) do
method = env.method |> to_string |> String.upcase
status = case env.status do
nil -> "";
200 -> "#{IO.ANSI.green} => 200"
status1 -> " => #{status1}"
end
header = case Map.equal?(env.headers, %{}) do
true -> ""
false -> :io_lib.format("~p", [env.headers])
end
options = case env.opts do
[] -> ""
options -> :io_lib.format("~p", [options])
end
"#{method} #{env.url} #{header} #{options} #{status}"
end

end

1 change: 1 addition & 0 deletions test/maxwell/middleware/json_test.exs
Expand Up @@ -5,6 +5,7 @@ defmodule JsonTest do
use Maxwell.Builder

middleware Maxwell.Middleware.Json, [encode_func: &Poison.encode/1, decode_fun: &Poison.decode/1, decode_content_types: ["text/html"], encode_content_type: "application/json"]
middleware Maxwell.Middleware.Logger

adapter fn (env) ->
case env.url do
Expand Down
16 changes: 16 additions & 0 deletions test/maxwell/middleware/logger_test.exs
@@ -0,0 +1,16 @@
defmodule LoggerTest do
use ExUnit.Case
import Maxwell.TestHelper

test "Middleware.Logger request" do
env = request(Maxwell.Middleware.Logger, %Maxwell{url: "/path"}, [])
assert env == %Maxwell{url: "/path"}
end

test "Middleware.Logger response" do
{:ok, env} = response(Maxwell.Middleware.Logger, {:ok, %Maxwell{url: "/path"}}, [])
assert env == %Maxwell{url: "/path"}
end

end

0 comments on commit 94a8b1b

Please sign in to comment.