@@ -13,54 +13,94 @@ defmodule GrpcReflection.Server.V1 do
1313
1414 response =
1515 state_mod
16- |> GrpcReflection.Server.Process . reflect ( request . message_request )
17- |> build_response ( )
16+ |> reflect ( request . message_request )
17+ |> handle_errors ( )
1818
1919 message =
20- struct ( ServerReflectionResponse ,
20+ % ServerReflectionResponse {
2121 valid_host: request . host ,
2222 original_request: request ,
2323 message_response: response
24- )
24+ }
2525
2626 Server . send_reply ( server , message )
2727 end )
2828 end
2929
30- defp build_response ( { :ok , { :file_descriptor_response , file_descriptor } } ) do
31- { :file_descriptor_response ,
32- % Grpc.Reflection.V1.FileDescriptorResponse {
33- file_descriptor_proto: [ Google.Protobuf.FileDescriptorProto . encode ( file_descriptor ) ]
34- } }
35- end
36-
37- defp build_response ( { :ok , { :all_extension_numbers_response , body } } ) do
38- encoded =
39- struct (
40- Grpc.Reflection.V1.ExtensionNumberResponse ,
41- body
42- )
43-
44- { :all_extension_numbers_response , encoded }
45- end
30+ defp handle_errors ( { :ok , payload } ) , do: payload
4631
47- defp build_response ( { :ok , { :list_services_response , % { service: services } } } ) do
48- { :list_services_response , % { service: services } }
49- end
50-
51- defp build_response ( { :error , :unimplemented } ) do
32+ defp handle_errors ( { :error , :unimplemented } ) do
5233 { :error_response ,
5334 % ErrorResponse {
5435 error_code: GRPC.Status . unimplemented ( ) ,
5536 error_message: "Operation not supported"
5637 } }
5738 end
5839
59- defp build_response ( { :error , reason } ) do
40+ defp handle_errors ( { :error , reason } ) do
6041 { :error_response ,
6142 % ErrorResponse {
6243 error_code: GRPC.Status . not_found ( ) ,
6344 error_message: reason
6445 } }
6546 end
47+
48+ def reflect ( state_mod , { :list_services , _ } ) do
49+ state_mod . list_services ( )
50+ |> Enum . map ( fn name -> % Grpc.Reflection.V1.ServiceResponse { name: name } end )
51+ |> then ( fn services ->
52+ { :ok , { :list_services_response , % Grpc.Reflection.V1.ListServiceResponse { service: services } } }
53+ end )
54+ end
55+
56+ def reflect ( state_mod , { :file_containing_symbol , symbol } ) do
57+ with { :ok , filename } <- state_mod . get_filename_by_symbol ( symbol ) ,
58+ { :ok , descriptor } <- state_mod . get_by_filename ( filename ) do
59+ { :ok ,
60+ { :file_descriptor_response ,
61+ % Grpc.Reflection.V1.FileDescriptorResponse {
62+ file_descriptor_proto: [ Google.Protobuf.FileDescriptorProto . encode ( descriptor ) ]
63+ } } }
64+ end
65+ end
66+
67+ def reflect ( state_mod , { :file_by_filename , filename } ) do
68+ with { :ok , descriptor } <- state_mod . get_by_filename ( filename ) do
69+ { :ok ,
70+ { :file_descriptor_response ,
71+ % Grpc.Reflection.V1.FileDescriptorResponse {
72+ file_descriptor_proto: [ Google.Protobuf.FileDescriptorProto . encode ( descriptor ) ]
73+ } } }
74+ end
75+ end
76+
77+ def reflect (
78+ state_mod ,
79+ { :file_containing_extension ,
80+ % { containing_type: containing_type , extension_number: _extension_number } }
81+ ) do
82+ with { :ok , descriptor } <- state_mod . get_by_extension ( containing_type ) do
83+ { :ok ,
84+ { :file_descriptor_response ,
85+ % Grpc.Reflection.V1.FileDescriptorResponse {
86+ file_descriptor_proto: [ Google.Protobuf.FileDescriptorProto . encode ( descriptor ) ]
87+ } } }
88+ end
89+ end
90+
91+ def reflect ( state_mod , { :all_extension_numbers_of_type , mod } ) do
92+ with { :ok , extension_numbers } <- state_mod . get_extension_numbers_by_type ( mod ) do
93+ { :ok ,
94+ { :all_extension_numbers_response ,
95+ % Grpc.Reflection.V1.ExtensionNumberResponse {
96+ base_type_name: mod ,
97+ extension_number: extension_numbers
98+ } } }
99+ end
100+ end
101+
102+ def reflect ( _state_mod , message_request ) do
103+ Logger . warning ( "received unexpected reflection request: #{ inspect ( message_request ) } " )
104+ { :error , :unimplemented }
105+ end
66106end
0 commit comments