package pkg import ( "errors" "strings" ) /* ltm profile rewrite rewrite-uri-translation { app-service none bypass-list none client-caching-type cache-css-js defaults-from rewrite java-ca-file ca-bundle.crt java-crl none java-sign-key default.key java-sign-key-passphrase-encrypted none java-signer default.crt location-specific false partition Common request { insert-xforwarded-for enabled insert-xforwarded-host disabled insert-xforwarded-proto disabled rewrite-headers enabled } response { rewrite-content enabled rewrite-headers enabled } rewrite-list none rewrite-mode uri-translation set-cookie-rules none split-tunneling false uri-rules none } */ type RewriteRequest struct { InsertXForwardedFor string `json:"insert_xforwarded_for"` InsertXForwardedHost string `json:"insert_xforwarded_host"` InsertXForwardedProto string `json:"insert_xforwarded_proto"` RewriteHeaders string `json:"rewrite_headers"` } type RewriteResponse struct { RewriteContent string `json:"rewrite_content"` RewriteHeaders string `json:"rewrite_headers"` } type RewriteProfile struct { ProfileCommon ByPassList []string `json:"bypass_list"` ClientCachingType string `json:"client_caching_type"` JavaCAFile string `json:"java_ca_file"` JavaCRL string `json:"java_crl"` JavaSignKey string `json:"java_sign_key"` JavaSignKeyPassphraseEncrypted string `json:"java_sign_key_passphrase_encrypted"` JavaSigner string `json:"java_signer"` LocationSpecific bool `json:"location_specific"` Request RewriteRequest `json:"request"` Response RewriteResponse `json:"rewrite"` RewriteList []string `json:"rewrite_list"` RewriteMode string `json:"rewrite_mode"` SetCookieRules []string `json:"set_cookie_rules"` SplitTunneling bool `json:"split_tunneling"` URIRules []string `json:"uri_rules"` } func ParseRewriteRequest(raw string) RewriteRequest { var r RewriteRequest for _, line := range strings.Split(raw, "\n") { f := strings.Fields(line) if len(f) == 0 { continue } switch strings.ToLower(f[0]) { case "insert-xforwarded-for": r.InsertXForwardedFor = f[1] case "insert-xforwarded-host": r.InsertXForwardedHost = f[1] case "insert-xforwarded-proto": r.InsertXForwardedProto = f[1] case "rewrite-headers": r.RewriteHeaders = f[1] } } return r } func ParseRewriteResponse(raw string) RewriteResponse { var r RewriteResponse for _, line := range strings.Split(raw, "\n") { f := strings.Fields(line) if len(f) == 0 { continue } switch strings.ToLower(f[0]) { case "rewrite-content": r.RewriteContent = f[1] case "rewrite-headers": r.RewriteHeaders = f[1] } } return r } func ParseRewrite(raw string) (*RewriteProfile, error) { p := new(RewriteProfile) split := strings.Split(raw, "\n") if !strings.Contains(split[0], "ltm profile rewrite") { return nil, errors.New("not a rewrite profile") } p.ProfileCommon = parseCommon(raw) p.ByPassList = []string{} p.RewriteList = []string{} p.URIRules = []string{} p.SetCookieRules = []string{} var inReq, inRes bool var req, res string for _, line := range split { if inReq { if line == " }" { p.Request = ParseRewriteRequest(req) inReq = false res = "" continue } req = req + line + "\n" continue } if inRes { if line == " }" { p.Response = ParseRewriteResponse(res) inRes = false res = "" continue } res = res + line + "\n" continue } f := strings.Fields(line) switch strings.ToLower(f[0]) { case "bypass-list": if f[1] != "none" { p.ByPassList = f[2 : len(f)-1] } case "client-caching-type": p.ClientCachingType = strings.Join(f[1:], " ") case "java-ca-file": p.JavaCAFile = f[1] case "java-crl": p.JavaCRL = f[1] case "java-sign-key": p.JavaSignKey = f[1] case "java-sign-key-passphrase-encrypted": p.JavaSignKeyPassphraseEncrypted = strings.Join(f[1:], " ") case "java-signer": p.JavaSigner = f[1] case "location-specific": p.LocationSpecific = parseBool(f[1]) case "request": inReq = true case "response": inRes = true case "rewrite-list": if f[1] != "none" { p.RewriteList = f[2 : len(f)-1] } case "rewrite-mode": p.RewriteMode = strings.Join(f[1:], " ") case "set-cookie-rules": if f[1] != "none" { p.SetCookieRules = f[2 : len(f)-1] } case "split-tunneling": p.SplitTunneling = parseBool(f[1]) case "uri-rules": if f[1] != "none" { p.URIRules = f[2 : len(f)-1] } } } return p, nil }