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  }