blob: f5479ac7b3439b2e78d582f52f6fbc5707fc946f [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 (
"net/http"
"regexp"
"strings"
)
import (
"github.com/apache/dubbo-go-pixiu/pkg/test/echo/proto"
)
var (
requestIDFieldRegex = regexp.MustCompile("(?i)" + string(RequestIDField) + "=(.*)")
serviceVersionFieldRegex = regexp.MustCompile(string(ServiceVersionField) + "=(.*)")
servicePortFieldRegex = regexp.MustCompile(string(ServicePortField) + "=(.*)")
statusCodeFieldRegex = regexp.MustCompile(string(StatusCodeField) + "=(.*)")
hostFieldRegex = regexp.MustCompile(string(HostField) + "=(.*)")
hostnameFieldRegex = regexp.MustCompile(string(HostnameField) + "=(.*)")
requestHeaderFieldRegex = regexp.MustCompile(string(RequestHeaderField) + "=(.*)")
responseHeaderFieldRegex = regexp.MustCompile(string(ResponseHeaderField) + "=(.*)")
URLFieldRegex = regexp.MustCompile(string(URLField) + "=(.*)")
ClusterFieldRegex = regexp.MustCompile(string(ClusterField) + "=(.*)")
IstioVersionFieldRegex = regexp.MustCompile(string(IstioVersionField) + "=(.*)")
IPFieldRegex = regexp.MustCompile(string(IPField) + "=(.*)")
methodFieldRegex = regexp.MustCompile(string(MethodField) + "=(.*)")
protocolFieldRegex = regexp.MustCompile(string(ProtocolField) + "=(.*)")
alpnFieldRegex = regexp.MustCompile(string(AlpnField) + "=(.*)")
)
func ParseResponses(req *proto.ForwardEchoRequest, resp *proto.ForwardEchoResponse) Responses {
responses := make([]Response, len(resp.Output))
for i, output := range resp.Output {
responses[i] = parseResponse(output)
responses[i].RequestURL = req.Url
}
return responses
}
func parseResponse(output string) Response {
out := Response{
RawContent: output,
RequestHeaders: make(http.Header),
ResponseHeaders: make(http.Header),
}
match := requestIDFieldRegex.FindStringSubmatch(output)
if match != nil {
out.ID = match[1]
}
match = methodFieldRegex.FindStringSubmatch(output)
if match != nil {
out.Method = match[1]
}
match = protocolFieldRegex.FindStringSubmatch(output)
if match != nil {
out.Protocol = match[1]
}
match = alpnFieldRegex.FindStringSubmatch(output)
if match != nil {
out.Alpn = match[1]
}
match = serviceVersionFieldRegex.FindStringSubmatch(output)
if match != nil {
out.Version = match[1]
}
match = servicePortFieldRegex.FindStringSubmatch(output)
if match != nil {
out.Port = match[1]
}
match = statusCodeFieldRegex.FindStringSubmatch(output)
if match != nil {
out.Code = match[1]
}
match = hostFieldRegex.FindStringSubmatch(output)
if match != nil {
out.Host = match[1]
}
match = hostnameFieldRegex.FindStringSubmatch(output)
if match != nil {
out.Hostname = match[1]
}
match = URLFieldRegex.FindStringSubmatch(output)
if match != nil {
out.URL = match[1]
}
match = ClusterFieldRegex.FindStringSubmatch(output)
if match != nil {
out.Cluster = match[1]
}
match = IstioVersionFieldRegex.FindStringSubmatch(output)
if match != nil {
out.IstioVersion = match[1]
}
match = IPFieldRegex.FindStringSubmatch(output)
if match != nil {
out.IP = match[1]
}
out.rawBody = map[string]string{}
matches := requestHeaderFieldRegex.FindAllStringSubmatch(output, -1)
for _, kv := range matches {
sl := strings.SplitN(kv[1], ":", 2)
if len(sl) != 2 {
continue
}
out.RequestHeaders.Set(sl[0], sl[1])
}
matches = responseHeaderFieldRegex.FindAllStringSubmatch(output, -1)
for _, kv := range matches {
sl := strings.SplitN(kv[1], ":", 2)
if len(sl) != 2 {
continue
}
out.ResponseHeaders.Set(sl[0], sl[1])
}
for _, l := range strings.Split(output, "\n") {
prefixSplit := strings.Split(l, "body] ")
if len(prefixSplit) != 2 {
continue
}
kv := strings.SplitN(prefixSplit[1], "=", 2)
if len(kv) != 2 {
continue
}
out.rawBody[kv[0]] = kv[1]
}
return out
}