Dear Eric,

Thank you so much for your reply, and apologies for not replying in turn. 
It was one of those situations in which I posted a question and then in the 
process of actually formulating the question, I solved the question. I 
thought I'd deleted my post before anyone saw it!

For posterity's sake, I did what you suggested. For the gateway, we have to 
ensure the header is passed through, so add an incoming header matcher to 
the mux:

addr := fmt.Sprintf(":%d", opts.RESTPort)
    dialOpts := []grpc.DialOption{grpc.WithInsecure()} // TODO:use better 
options
    mux := runtime.NewServeMux(runtime.WithIncomingHeaderMatcher
(headerMatcher))


where headerMatcher func is defined as:

// ensures GRPC gateway passes through the standard HTTP header 
Accept-Language as "accept-language"
// rather than munging the name prefixed with grpcgateway.
// delegates to default implementation for other headers.
func headerMatcher(headerName string) (mdName string, ok bool) {
    if headerName == "Accept-Language" {
        return "accept-language", true
    }
    return runtime.DefaultHeaderMatcher(headerName)
}


And then in my grpc-server implementation, I have this helper func:

// determine preferred language tags from the context, or fallback to a 
reasonable default
func (ss *coreServer) languageTags(ctx context.Context) ([]language.Tag, 
error) {
    if md, ok := metadata.FromIncomingContext(ctx); ok {
        preferred := md.Get("accept-language")
        if len(preferred) > 0 {
            pref := strings.Join(preferred, ";")
            tags, _, err := language.ParseAcceptLanguage(pref)
            if err != nil {
                return nil, status.Errorf(codes.InvalidArgument, "invalid 
accept-language header: %s", err)
            }
            return tags, nil
        }
    }
    return ss.lang, nil
}




which I use like this in any endpoint it is needed:

func (ss *coreServer) GetExtendedConcept(ctx context.Context, conceptID 
*snomed.SctID) (*snomed.ExtendedConcept, error) {
    tags, err := ss.languageTags(ctx)
    if err != nil {
        return nil, err
    }
    return ss.svc.ExtendedConcept(conceptID.Identifier, tags)
}

Best wishes,

Mark

On Friday, 16 November 2018 18:24:06 UTC, Eric Anderson wrote:
>
> It's not outrageous to read HTTP standard headers from gRPC. I'm not 
> super-well versed with grpc-gateway, but I'm not seeing any configuration 
> for this supported by grpc-gateway. (SystemParameters 
> <https://cloud.google.com/service-infrastructure/docs/service-management/reference/rpc/google.api#google.api.SystemParameters>
>  *may* be a solution, but it doesn't seem supported by grpc-gateway and 
> is unclear if it is the "right" solution.)
>
> So I guess either just read from Accept-Language directly or add 
> the "string language_preferences=2" and read from Accept-Language if 
> language_preferences is empty.
>
> On Mon, Nov 12, 2018 at 5:28 AM Mark Wardle <[email protected] 
> <javascript:>> wrote:
>
>>
>> Dear all,
>>
>> I have a gRPC service that provides results that can be localized. I am 
>> using gRPC as well as the grpc-gateway to automatically generate a REST 
>> service running in parallel.
>>
>> The usual way of specifying locale preferences in REST services is via 
>> Accept-Language tags. As this is, strictly speaking, part of the API 
>> contract, does it make sense to write a gRPC service description that 
>> explicitly documents this parameter. I could therefore easily add a "string 
>> language_preferences=2" to the request message definition? If so, is there 
>> a clever way to populate this in the grpc-gateway much like URL parameters?
>>
>> Or is there a better way of handling language preferences in grpc and 
>> grpc-gateway?
>>
>> Many thanks,
>>
>> Mark
>>
>> -- 
>> You received this message because you are subscribed to the Google Groups 
>> "grpc.io" group.
>> To unsubscribe from this group and stop receiving emails from it, send an 
>> email to [email protected] <javascript:>.
>> To post to this group, send email to [email protected] 
>> <javascript:>.
>> Visit this group at https://groups.google.com/group/grpc-io.
>> To view this discussion on the web visit 
>> https://groups.google.com/d/msgid/grpc-io/8033c8e1-2516-40b2-889d-60885ca77419%40googlegroups.com
>>  
>> <https://groups.google.com/d/msgid/grpc-io/8033c8e1-2516-40b2-889d-60885ca77419%40googlegroups.com?utm_medium=email&utm_source=footer>
>> .
>> For more options, visit https://groups.google.com/d/optout.
>>
>

-- 
You received this message because you are subscribed to the Google Groups 
"grpc.io" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/grpc-io.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/grpc-io/1349a840-1f94-436d-baa7-cce1ef041424%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to