grpc/proto/
headers.rs

1use crate::proto::grpc_status::GrpcStatus;
2use crate::Metadata;
3use httpbis::BytesDeque;
4use httpbis::Header;
5use httpbis::Headers;
6
7pub(crate) static HEADER_GRPC_STATUS: &'static str = "grpc-status";
8pub(crate) static HEADER_GRPC_MESSAGE: &'static str = "grpc-message";
9
10pub(crate) fn headers_500(grpc_status: GrpcStatus, message: String) -> Headers {
11    Headers::from_vec(vec![
12        Header::new(":status", "500"),
13        Header::new("content-type", "application/grpc"),
14        Header::new(HEADER_GRPC_STATUS, format!("{}", grpc_status as i32)),
15        Header::new(HEADER_GRPC_MESSAGE, message),
16    ])
17}
18
19pub(crate) fn headers_200(metadata: Metadata) -> Headers {
20    let mut headers = Headers::from_vec(vec![
21        // TODO: do not allocate
22        Header::new(":status", "200"),
23        Header::new("content-type", "application/grpc"),
24        Header::new(HEADER_GRPC_STATUS, "0"),
25    ]);
26    headers.extend(metadata.into_headers());
27    headers
28}
29
30/// Create HTTP response for gRPC error
31pub(crate) fn grpc_error_message(message: &str) -> httpbis::SimpleHttpMessage {
32    let headers = Headers::from_vec(vec![
33        Header::new(":status", "200"),
34        // TODO: alloc
35        Header::new(
36            HEADER_GRPC_STATUS,
37            format!("{}", GrpcStatus::Internal.code()),
38        ),
39        Header::new(HEADER_GRPC_MESSAGE, message.to_owned()),
40    ]);
41    httpbis::SimpleHttpMessage {
42        headers,
43        body: BytesDeque::new(),
44    }
45}
46
47// Trailers -> Status [Status-Message] *Custom-Metadata
48pub(crate) fn trailers(
49    grpc_status: GrpcStatus,
50    message: Option<String>,
51    metadata: Metadata,
52) -> Headers {
53    let mut headers = Headers::from_vec(vec![Header::new(
54        HEADER_GRPC_STATUS,
55        format!("{}", grpc_status as i32),
56    )]);
57    if let Some(message) = message {
58        headers.add_header(Header::new(HEADER_GRPC_MESSAGE, message));
59    }
60    headers.extend(metadata.into_headers());
61    headers
62}