Option to keep or remove prefix when router triggers prefix based function (#2133)
Signed-off-by: Sanket Sudake <sanketsudake@gmail.com>
This commit is contained in:
@@ -76,6 +76,9 @@ spec:
|
|||||||
description: TLS is for user to specify a Secret that contains TLS key and certificate. The domain name in the key and crt must match the value of Host field.
|
description: TLS is for user to specify a Secret that contains TLS key and certificate. The domain name in the key and crt must match the value of Host field.
|
||||||
type: string
|
type: string
|
||||||
type: object
|
type: object
|
||||||
|
keepPrefix:
|
||||||
|
description: When function is exposed with Prefix based path, keepPrefix decides whether to keep or trim prefix in URL while invoking function.
|
||||||
|
type: boolean
|
||||||
method:
|
method:
|
||||||
description: Use Methods instead of Method. This field is going to be deprecated in a future release HTTP method to access a function.
|
description: Use Methods instead of Method. This field is going to be deprecated in a future release HTTP method to access a function.
|
||||||
type: string
|
type: string
|
||||||
|
|||||||
@@ -664,6 +664,11 @@ type (
|
|||||||
// +optional
|
// +optional
|
||||||
Prefix *string `json:"prefix,omitempty"`
|
Prefix *string `json:"prefix,omitempty"`
|
||||||
|
|
||||||
|
// When function is exposed with Prefix based path,
|
||||||
|
// keepPrefix decides whether to keep or trim prefix in URL while invoking function.
|
||||||
|
// +optional
|
||||||
|
KeepPrefix bool `json:"keepPrefix,omitempty"`
|
||||||
|
|
||||||
// Use Methods instead of Method. This field is going to be deprecated in a future release
|
// Use Methods instead of Method. This field is going to be deprecated in a future release
|
||||||
// HTTP method to access a function.
|
// HTTP method to access a function.
|
||||||
// +optional
|
// +optional
|
||||||
|
|||||||
@@ -236,6 +236,7 @@ var map_HTTPTriggerSpec = map[string]string{
|
|||||||
"host": "Deprecated: the original idea of this field is not for setting Ingress. Since we have IngressConfig now, remove Host after couple releases.",
|
"host": "Deprecated: the original idea of this field is not for setting Ingress. Since we have IngressConfig now, remove Host after couple releases.",
|
||||||
"relativeurl": "RelativeURL is the exposed URL for external client to access a function with.",
|
"relativeurl": "RelativeURL is the exposed URL for external client to access a function with.",
|
||||||
"prefix": "Prefix with which functions are exposed. NOTE: Prefix takes precedence over URL/RelativeURL. Note that it does not treat slashes specially (\"/foobar/\" will be matched by the prefix \"/foobar\").",
|
"prefix": "Prefix with which functions are exposed. NOTE: Prefix takes precedence over URL/RelativeURL. Note that it does not treat slashes specially (\"/foobar/\" will be matched by the prefix \"/foobar\").",
|
||||||
|
"keepPrefix": "When function is exposed with Prefix based path, keepPrefix decides whether to keep or trim prefix in URL while invoking function.",
|
||||||
"method": "Use Methods instead of Method. This field is going to be deprecated in a future release HTTP method to access a function.",
|
"method": "Use Methods instead of Method. This field is going to be deprecated in a future release HTTP method to access a function.",
|
||||||
"methods": "HTTP methods to access a function",
|
"methods": "HTTP methods to access a function",
|
||||||
"functionref": "FunctionReference is a reference to the target function.",
|
"functionref": "FunctionReference is a reference to the target function.",
|
||||||
|
|||||||
@@ -33,7 +33,8 @@ func Commands() *cobra.Command {
|
|||||||
Required: []flag.Flag{flag.HtFnName},
|
Required: []flag.Flag{flag.HtFnName},
|
||||||
Optional: []flag.Flag{flag.HtUrl, flag.HtName, flag.HtMethod, flag.HtIngress,
|
Optional: []flag.Flag{flag.HtUrl, flag.HtName, flag.HtMethod, flag.HtIngress,
|
||||||
flag.HtIngressRule, flag.HtIngressAnnotation, flag.HtIngressTLS,
|
flag.HtIngressRule, flag.HtIngressAnnotation, flag.HtIngressTLS,
|
||||||
flag.HtFnWeight, flag.HtHost, flag.NamespaceFunction, flag.SpecSave, flag.SpecDry, flag.HtPrefix},
|
flag.HtFnWeight, flag.HtHost, flag.NamespaceFunction, flag.SpecSave, flag.SpecDry,
|
||||||
|
flag.HtPrefix, flag.HtKeepPrefix},
|
||||||
})
|
})
|
||||||
|
|
||||||
getCmd := &cobra.Command{
|
getCmd := &cobra.Command{
|
||||||
@@ -56,7 +57,8 @@ func Commands() *cobra.Command {
|
|||||||
Required: []flag.Flag{flag.HtName},
|
Required: []flag.Flag{flag.HtName},
|
||||||
Optional: []flag.Flag{flag.HtUrl, flag.HtFnName,
|
Optional: []flag.Flag{flag.HtUrl, flag.HtFnName,
|
||||||
flag.HtMethod, flag.HtIngress, flag.HtIngressRule, flag.HtIngressAnnotation,
|
flag.HtMethod, flag.HtIngress, flag.HtIngressRule, flag.HtIngressAnnotation,
|
||||||
flag.HtIngressTLS, flag.HtFnWeight, flag.HtHost, flag.NamespaceTrigger, flag.HtPrefix},
|
flag.HtIngressTLS, flag.HtFnWeight, flag.HtHost, flag.NamespaceTrigger,
|
||||||
|
flag.HtPrefix, flag.HtKeepPrefix},
|
||||||
})
|
})
|
||||||
|
|
||||||
deleteCmd := &cobra.Command{
|
deleteCmd := &cobra.Command{
|
||||||
|
|||||||
@@ -179,9 +179,14 @@ func (opts *CreateSubCommand) complete(input cli.Input) error {
|
|||||||
CreateIngress: createIngress,
|
CreateIngress: createIngress,
|
||||||
IngressConfig: *ingressConfig,
|
IngressConfig: *ingressConfig,
|
||||||
Prefix: &prefix,
|
Prefix: &prefix,
|
||||||
|
KeepPrefix: input.Bool(flagkey.HtKeepPrefix),
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if input.IsSet(flagkey.HtKeepPrefix) {
|
||||||
|
opts.trigger.Spec.KeepPrefix = input.Bool(flagkey.HtKeepPrefix)
|
||||||
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -80,6 +80,10 @@ func (opts *UpdateSubCommand) complete(input cli.Input) error {
|
|||||||
ht.Spec.RelativeURL = triggerUrl
|
ht.Spec.RelativeURL = triggerUrl
|
||||||
ht.Spec.Prefix = &prefix
|
ht.Spec.Prefix = &prefix
|
||||||
|
|
||||||
|
if input.IsSet(flagkey.HtKeepPrefix) {
|
||||||
|
ht.Spec.KeepPrefix = input.Bool(flagkey.HtKeepPrefix)
|
||||||
|
}
|
||||||
|
|
||||||
methods := input.StringSlice(flagkey.HtMethod)
|
methods := input.StringSlice(flagkey.HtMethod)
|
||||||
if len(methods) > 0 {
|
if len(methods) > 0 {
|
||||||
for _, method := range methods {
|
for _, method := range methods {
|
||||||
|
|||||||
@@ -134,6 +134,7 @@ var (
|
|||||||
HtFnWeight = Flag{Type: IntSlice, Name: flagkey.HtFnWeight, Usage: "Weight for each function supplied with --function flag, in the same order. Used for canary deployment"}
|
HtFnWeight = Flag{Type: IntSlice, Name: flagkey.HtFnWeight, Usage: "Weight for each function supplied with --function flag, in the same order. Used for canary deployment"}
|
||||||
HtFnFilter = Flag{Type: String, Name: flagkey.HtFilter, Usage: "Name of the function for trigger(s)"}
|
HtFnFilter = Flag{Type: String, Name: flagkey.HtFilter, Usage: "Name of the function for trigger(s)"}
|
||||||
HtPrefix = Flag{Type: String, Name: flagkey.HtPrefix, Usage: "Prefix with which functions are exposed. NOTE: Prefix takes precedence over URL/RelativeURL"}
|
HtPrefix = Flag{Type: String, Name: flagkey.HtPrefix, Usage: "Prefix with which functions are exposed. NOTE: Prefix takes precedence over URL/RelativeURL"}
|
||||||
|
HtKeepPrefix = Flag{Type: Bool, Name: flagkey.HtKeepPrefix, Usage: "Keep the prefix in the URL while forwarding request to the function"}
|
||||||
|
|
||||||
TtName = Flag{Type: String, Name: flagkey.TtName, Usage: "Time Trigger name"}
|
TtName = Flag{Type: String, Name: flagkey.TtName, Usage: "Time Trigger name"}
|
||||||
TtCron = Flag{Type: String, Name: flagkey.TtCron, Usage: "Time trigger cron spec with each asterisk representing respectively second, minute, hour, the day of the month, month and day of the week. Also supports readable formats like '@every 5m', '@hourly'"}
|
TtCron = Flag{Type: String, Name: flagkey.TtCron, Usage: "Time trigger cron spec with each asterisk representing respectively second, minute, hour, the day of the month, month and day of the week. Also supports readable formats like '@every 5m', '@hourly'"}
|
||||||
|
|||||||
@@ -87,6 +87,7 @@ const (
|
|||||||
HtFnWeight = "weight"
|
HtFnWeight = "weight"
|
||||||
HtFilter = HtFnName
|
HtFilter = HtFnName
|
||||||
HtPrefix = "prefix"
|
HtPrefix = "prefix"
|
||||||
|
HtKeepPrefix = "keepprefix"
|
||||||
|
|
||||||
TtName = resourceName
|
TtName = resourceName
|
||||||
TtCron = "cron"
|
TtCron = "cron"
|
||||||
|
|||||||
@@ -266,13 +266,17 @@ func (roundTripper *RetryingRoundTripper) RoundTrip(req *http.Request) (*http.Re
|
|||||||
// req.URL.Path according to httpTrigger specification.
|
// req.URL.Path according to httpTrigger specification.
|
||||||
prefixTrim := ""
|
prefixTrim := ""
|
||||||
functionURL := utils.UrlForFunction(fnMeta.Name, fnMeta.Namespace)
|
functionURL := utils.UrlForFunction(fnMeta.Name, fnMeta.Namespace)
|
||||||
|
keepPrefix := false
|
||||||
if roundTripper.funcHandler.httpTrigger != nil && roundTripper.funcHandler.httpTrigger.Spec.Prefix != nil && *roundTripper.funcHandler.httpTrigger.Spec.Prefix != "" {
|
if roundTripper.funcHandler.httpTrigger != nil && roundTripper.funcHandler.httpTrigger.Spec.Prefix != nil && *roundTripper.funcHandler.httpTrigger.Spec.Prefix != "" {
|
||||||
prefixTrim = *roundTripper.funcHandler.httpTrigger.Spec.Prefix
|
prefixTrim = *roundTripper.funcHandler.httpTrigger.Spec.Prefix
|
||||||
|
keepPrefix = roundTripper.funcHandler.httpTrigger.Spec.KeepPrefix
|
||||||
} else if strings.HasPrefix(req.URL.Path, functionURL) {
|
} else if strings.HasPrefix(req.URL.Path, functionURL) {
|
||||||
prefixTrim = functionURL
|
prefixTrim = functionURL
|
||||||
}
|
}
|
||||||
if prefixTrim != "" {
|
if prefixTrim != "" {
|
||||||
req.URL.Path = strings.TrimPrefix(req.URL.Path, prefixTrim)
|
if !keepPrefix {
|
||||||
|
req.URL.Path = strings.TrimPrefix(req.URL.Path, prefixTrim)
|
||||||
|
}
|
||||||
if !strings.HasPrefix(req.URL.Path, "/") {
|
if !strings.HasPrefix(req.URL.Path, "/") {
|
||||||
req.URL.Path = "/" + req.URL.Path
|
req.URL.Path = "/" + req.URL.Path
|
||||||
}
|
}
|
||||||
@@ -280,6 +284,10 @@ func (roundTripper *RetryingRoundTripper) RoundTrip(req *http.Request) (*http.Re
|
|||||||
req.URL.Path = "/"
|
req.URL.Path = "/"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
logger.Debug("function invoke url",
|
||||||
|
zap.String("prefixTrim", prefixTrim),
|
||||||
|
zap.Bool("keepPrefix", keepPrefix),
|
||||||
|
zap.String("hitURL", req.URL.Path))
|
||||||
// Overwrite request host with internal host,
|
// Overwrite request host with internal host,
|
||||||
// or request will be blocked in some situations
|
// or request will be blocked in some situations
|
||||||
// (e.g. istio-proxy)
|
// (e.g. istio-proxy)
|
||||||
|
|||||||
Reference in New Issue
Block a user