blob: 32f1da0159962696cc881f2fab905eaa5d4334ac [file] [log] [blame]
// Copyright Istio Authors
//
// 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 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 echo
import (
"fmt"
"net/http"
"sort"
"strings"
)
// HeaderType is a helper enum for retrieving Headers from a Response.
type HeaderType string
const (
RequestHeader HeaderType = "request"
ResponseHeader HeaderType = "response"
)
// Response represents a response to a single echo request.
type Response struct {
// RequestURL is the requested URL. This differs from URL, which is the just the path.
// For example, RequestURL=http://foo/bar, URL=/bar
RequestURL string
// Method used (for HTTP).
Method string
// Protocol used for the request.
Protocol string
// Alpn value (for HTTP).
Alpn string
// RawContent is the original unparsed content for this response
RawContent string
// ID is a unique identifier of the resource in the response
ID string
// URL is the url the request is sent to
URL string
// Version is the version of the resource in the response
Version string
// Port is the port of the resource in the response
Port string
// Code is the response code
Code string
// Host is the host called by the request
Host string
// Hostname is the host that responded to the request
Hostname string
// The cluster where the server is deployed.
Cluster string
// IstioVersion for the Istio sidecar.
IstioVersion string
// IP is the requester's ip address
IP string
// rawBody gives a map of all key/values in the body of the response.
rawBody map[string]string
RequestHeaders http.Header
ResponseHeaders http.Header
}
// Count occurrences of the given text within the body of this response.
func (r Response) Count(text string) int {
return strings.Count(r.RawContent, text)
}
// GetHeaders returns the appropriate headers for the given type.
func (r Response) GetHeaders(hType HeaderType) http.Header {
switch hType {
case RequestHeader:
return r.RequestHeaders
case ResponseHeader:
return r.ResponseHeaders
default:
panic("invalid HeaderType enum: " + hType)
}
}
// Body returns the lines of the response body, in order
func (r Response) Body() []string {
type keyValue struct {
k, v string
}
var keyValues []keyValue
// rawBody is in random order, so get the order back via sorting.
for k, v := range r.rawBody {
keyValues = append(keyValues, keyValue{k, v})
}
sort.Slice(keyValues, func(i, j int) bool {
return keyValues[i].k < keyValues[j].k
})
var resp []string
for _, kv := range keyValues {
resp = append(resp, kv.v)
}
return resp
}
func (r Response) String() string {
out := ""
out += fmt.Sprintf("RawContent: %s\n", r.RawContent)
out += fmt.Sprintf("ID: %s\n", r.ID)
out += fmt.Sprintf("Method: %s\n", r.Method)
out += fmt.Sprintf("Protocol: %s\n", r.Protocol)
out += fmt.Sprintf("Alpn: %s\n", r.Alpn)
out += fmt.Sprintf("URL: %s\n", r.URL)
out += fmt.Sprintf("Version: %s\n", r.Version)
out += fmt.Sprintf("Port: %s\n", r.Port)
out += fmt.Sprintf("Code: %s\n", r.Code)
out += fmt.Sprintf("Host: %s\n", r.Host)
out += fmt.Sprintf("Hostname: %s\n", r.Hostname)
out += fmt.Sprintf("Cluster: %s\n", r.Cluster)
out += fmt.Sprintf("IstioVersion: %s\n", r.IstioVersion)
out += fmt.Sprintf("IP: %s\n", r.IP)
out += fmt.Sprintf("Request Headers: %v\n", r.RequestHeaders)
out += fmt.Sprintf("Response Headers: %v\n", r.ResponseHeaders)
return out
}