github.com/xmidt-org/webpa-common@v1.11.9/bookkeeping/requestResponse.go (about) 1 package bookkeeping 2 3 import ( 4 "github.com/xmidt-org/webpa-common/xhttp" 5 "io/ioutil" 6 "net/http" 7 "net/textproto" 8 "strings" 9 ) 10 11 func Code(response CapturedResponse) []interface{} { 12 return []interface{}{"code", response.Code} 13 } 14 15 func RequestBody(request *http.Request) []interface{} { 16 err := xhttp.EnsureRewindable(request) 17 if err != nil { 18 return []interface{}{} 19 } 20 data, err := ioutil.ReadAll(request.Body) 21 request.Body.Close() 22 if err != nil { 23 return []interface{}{} 24 } 25 xhttp.Rewind(request) 26 if len(data) == 0 { 27 return []interface{}{"req-body", "empty body"} 28 } 29 return []interface{}{"req-body", string(data)} 30 31 } 32 33 func ResponseBody(response CapturedResponse) []interface{} { 34 if response.Payload == nil { 35 return []interface{}{"res-body", "empty body"} 36 } 37 38 return []interface{}{"res-body", string(response.Payload)} 39 40 } 41 42 func RequestHeaders(headers ...string) RequestFunc { 43 canonicalizedHeaders := getCanoicalizedHeaders(headers...) 44 return func(request *http.Request) []interface{} { 45 return parseHeader(request.Header, canonicalizedHeaders) 46 } 47 } 48 49 func ResponseHeaders(headers ...string) ResponseFunc { 50 canonicalizedHeaders := getCanoicalizedHeaders(headers...) 51 return func(response CapturedResponse) []interface{} { 52 return parseHeader(response.Header, canonicalizedHeaders) 53 } 54 } 55 56 func getCanoicalizedHeaders(headers ...string) []string { 57 canonicalizedHeaders := make([]string, len(headers)) 58 for i := 0; i < len(headers); i++ { 59 canonicalizedHeaders[i] = textproto.CanonicalMIMEHeaderKey(headers[i]) 60 } 61 return canonicalizedHeaders 62 } 63 64 func parseHeader(header http.Header, canonicalizedHeaders []string) []interface{} { 65 kv := make([]interface{}, 0) 66 for _, key := range canonicalizedHeaders { 67 if values := header[key]; len(values) > 0 { 68 kv = append(kv, key, values) 69 } 70 } 71 return kv 72 } 73 74 func parseHeaderWithPrefix(header http.Header, canonicalizedHeaders []string) []interface{} { 75 kv := make([]interface{}, 0) 76 for _, prefix := range canonicalizedHeaders { 77 for key, results := range header { 78 if strings.HasPrefix(key, prefix) && len(results) > 0 { 79 kv = append(kv, key, results) 80 } 81 } 82 } 83 return kv 84 } 85 86 func RequestHeadersWithPrefix(headers ...string) RequestFunc { 87 canonicalizedHeaders := getCanoicalizedHeaders(headers...) 88 return func(request *http.Request) []interface{} { 89 if request == nil { 90 return []interface{}{} 91 } 92 return parseHeaderWithPrefix(request.Header, canonicalizedHeaders) 93 } 94 } 95 96 func ResponseHeadersWithPrefix(headers ...string) ResponseFunc { 97 canonicalizedHeaders := getCanoicalizedHeaders(headers...) 98 return func(response CapturedResponse) []interface{} { 99 return parseHeaderWithPrefix(response.Header, canonicalizedHeaders) 100 } 101 }