forked from vitessio/vitess
-
Notifications
You must be signed in to change notification settings - Fork 0
/
callinfo.go
67 lines (52 loc) · 1.79 KB
/
callinfo.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
/*
Copyright 2017 Google Inc.
Licensed 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 agreedto 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 callinfo stores custom values into the Context
// (related to the RPC source)
package callinfo
import (
"html/template"
"golang.org/x/net/context"
)
// CallInfo is the extra data stored in the Context
type CallInfo interface {
// RemoteAddr is the remote address information for this rpc call.
RemoteAddr() string
// Username is associated with this rpc call, if any.
Username() string
// Text is a text version of this connection, as specifically as possible.
Text() string
// HTML represents this rpc call connection in a web-friendly way.
HTML() template.HTML
}
// internal type and value
type key int
var callInfoKey key = 0
// NewContext adds the provided CallInfo to the context
func NewContext(ctx context.Context, ci CallInfo) context.Context {
return context.WithValue(ctx, callInfoKey, ci)
}
// FromContext returns the CallInfo value stored in ctx, if any.
func FromContext(ctx context.Context) (CallInfo, bool) {
ci, ok := ctx.Value(callInfoKey).(CallInfo)
return ci, ok
}
// HTMLFromContext returns that value of HTML() from the context, or "" if we're
// not able to recover one
func HTMLFromContext(ctx context.Context) template.HTML {
var h template.HTML
ci, ok := FromContext(ctx)
if ok {
return ci.HTML()
}
return h
}