12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394 |
- /*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
- package thrift
- import (
- "context"
- )
- // See https://pkg.go.dev/context#WithValue on why do we need the unexported typedefs.
- type responseHelperKey struct{}
- // TResponseHelper defines a object with a set of helper functions that can be
- // retrieved from the context object passed into server handler functions.
- //
- // Use GetResponseHelper to retrieve the injected TResponseHelper implementation
- // from the context object.
- //
- // The zero value of TResponseHelper is valid with all helper functions being
- // no-op.
- type TResponseHelper struct {
- // THeader related functions
- *THeaderResponseHelper
- }
- // THeaderResponseHelper defines THeader related TResponseHelper functions.
- //
- // The zero value of *THeaderResponseHelper is valid with all helper functions
- // being no-op.
- type THeaderResponseHelper struct {
- proto *THeaderProtocol
- }
- // NewTHeaderResponseHelper creates a new THeaderResponseHelper from the
- // underlying TProtocol.
- func NewTHeaderResponseHelper(proto TProtocol) *THeaderResponseHelper {
- if hp, ok := proto.(*THeaderProtocol); ok {
- return &THeaderResponseHelper{
- proto: hp,
- }
- }
- return nil
- }
- // SetHeader sets a response header.
- //
- // It's no-op if the underlying protocol/transport does not support THeader.
- func (h *THeaderResponseHelper) SetHeader(key, value string) {
- if h != nil && h.proto != nil {
- h.proto.SetWriteHeader(key, value)
- }
- }
- // ClearHeaders clears all the response headers previously set.
- //
- // It's no-op if the underlying protocol/transport does not support THeader.
- func (h *THeaderResponseHelper) ClearHeaders() {
- if h != nil && h.proto != nil {
- h.proto.ClearWriteHeaders()
- }
- }
- // GetResponseHelper retrieves the TResponseHelper implementation injected into
- // the context object.
- //
- // If no helper was found in the context object, a nop helper with ok == false
- // will be returned.
- func GetResponseHelper(ctx context.Context) (helper TResponseHelper, ok bool) {
- if v := ctx.Value(responseHelperKey{}); v != nil {
- helper, ok = v.(TResponseHelper)
- }
- return
- }
- // SetResponseHelper injects TResponseHelper into the context object.
- func SetResponseHelper(ctx context.Context, helper TResponseHelper) context.Context {
- return context.WithValue(ctx, responseHelperKey{}, helper)
- }
|