@@ -3,6 +3,7 @@ defmodule GRPC.Server.Adapters.Cowboy.Handler do
33 A cowboy handler accepting all requests and calls corresponding functions defined by users.
44 """
55
6+ alias GRPC.Server.Adapters.ReportException
67 alias GRPC.Transport.HTTP2
78 alias GRPC.RPCError
89 require Logger
@@ -72,7 +73,7 @@ defmodule GRPC.Server.Adapters.Cowboy.Handler do
7273 http_transcode: transcode? ( req )
7374 }
7475
75- server_rpc_pid = spawn_link ( __MODULE__ , :call_rpc , [ server , route , stream ] )
76+ server_rpc_pid = :proc_lib . spawn_link ( __MODULE__ , :call_rpc , [ server , route , stream ] )
7677 Process . flag ( :trap_exit , true )
7778
7879 req = :cowboy_req . set_resp_headers ( HTTP2 . server_headers ( stream ) , req )
@@ -455,27 +456,37 @@ defmodule GRPC.Server.Adapters.Cowboy.Handler do
455456 end
456457
457458 # expected error raised from user to return error immediately
458- def info ( { :EXIT , pid , { % RPCError { } = error , _stacktrace } } , req , state = % { pid: pid } ) do
459+ def info ( { :EXIT , pid , { % RPCError { } = error , stacktrace } } , req , state = % { pid: pid } ) do
459460 req = send_error ( req , error , state , :rpc_error )
461+
462+ [ req: req ]
463+ |> ReportException . new ( error , stacktrace )
464+ |> log_error ( stacktrace )
465+
460466 { :stop , req , state }
461467 end
462468
463469 # unknown error raised from rpc
464- def info ( { :EXIT , pid , { :handle_error , _kind } } = err , req , state = % { pid: pid } ) do
465- Logger . warning ( "3. #{ inspect ( state ) } #{ inspect ( err ) } " )
470+ def info ( { :EXIT , pid , { :handle_error , error } } , req , state = % { pid: pid } ) do
471+ % { kind: kind , reason: reason , stack: stack } = error
472+ rpc_error = % RPCError { status: GRPC.Status . unknown ( ) , message: "Internal Server Error" }
473+ req = send_error ( req , rpc_error , state , :error )
466474
467- error = % RPCError { status: GRPC.Status . unknown ( ) , message: "Internal Server Error" }
468- req = send_error ( req , error , state , :error )
475+ [ req: req ]
476+ |> ReportException . new ( reason , stack , kind )
477+ |> log_error ( stack )
469478
470479 { :stop , req , state }
471480 end
472481
473482 def info ( { :EXIT , pid , { reason , stacktrace } } , req , state = % { pid: pid } ) do
474- Logger . error ( Exception . format ( :error , reason , stacktrace ) )
475-
476483 error = % RPCError { status: GRPC.Status . unknown ( ) , message: "Internal Server Error" }
477484 req = send_error ( req , error , state , reason )
478485
486+ [ req: req ]
487+ |> ReportException . new ( reason , stacktrace )
488+ |> log_error ( stacktrace )
489+
479490 { :stop , req , state }
480491 end
481492
@@ -500,17 +511,17 @@ defmodule GRPC.Server.Adapters.Cowboy.Handler do
500511 end
501512 catch
502513 kind , e ->
503- Logger . error ( Exception . format ( kind , e , __STACKTRACE__ ) )
514+ reason = Exception . normalize ( kind , e , __STACKTRACE__ )
504515
505- exit ( { :handle_error , kind } )
516+ { :error , % { kind: kind , reason: reason , stack: __STACKTRACE__ } }
506517 end
507518
508519 case result do
509520 { :error , % GRPC.RPCError { } = e } ->
510- exit ( { e , "" } )
521+ exit ( { e , _stacktrace = [ ] } )
511522
512- { :error , % { kind: kind } } ->
513- exit ( { :handle_error , kind } )
523+ { :error , % { kind: _kind , reason: _reason , stack: _stack } = e } ->
524+ exit ( { :handle_error , e } )
514525
515526 other ->
516527 other
@@ -648,4 +659,12 @@ defmodule GRPC.Server.Adapters.Cowboy.Handler do
648659
649660 { :wait , ref }
650661 end
662+
663+ defp log_error ( % ReportException { kind: kind } = exception , stacktrace ) do
664+ crash_reason = GRPC.Logger . crash_reason ( kind , exception , stacktrace )
665+
666+ kind
667+ |> Exception . format ( exception , stacktrace )
668+ |> Logger . error ( crash_reason: crash_reason )
669+ end
651670end
0 commit comments