@@ -57,7 +57,7 @@ func (rm *Routing) ServeHTTP(w http.ResponseWriter, r *http.Request) {
57
57
}
58
58
r = r .WithContext (util .ContextWithHTTPSO (r .Context (), httpso ))
59
59
60
- stream , err := rm .streamFromHTTPSO (r .Context (), httpso )
60
+ stream , err := rm .streamFromHTTPSO (r .Context (), httpso , httpso . Spec . ScaleTargetRef )
61
61
if err != nil {
62
62
sh := handler .NewStatic (http .StatusInternalServerError , err )
63
63
sh .ServeHTTP (w , r )
@@ -66,45 +66,61 @@ func (rm *Routing) ServeHTTP(w http.ResponseWriter, r *http.Request) {
66
66
}
67
67
r = r .WithContext (util .ContextWithStream (r .Context (), stream ))
68
68
69
+ if httpso .Spec .FallbackTargetRef != nil {
70
+ fallbackStream , err := rm .streamFromHTTPSO (r .Context (), httpso , httpso .Spec .FallbackTargetRef )
71
+ if err != nil {
72
+ sh := handler .NewStatic (http .StatusInternalServerError , err )
73
+ sh .ServeHTTP (w , r )
74
+ return
75
+ }
76
+ r = r .WithContext (util .ContextWithFallbackStream (r .Context (), fallbackStream ))
77
+ }
78
+
69
79
rm .upstreamHandler .ServeHTTP (w , r )
70
80
}
71
81
72
- func (rm * Routing ) getPort (ctx context.Context , httpso * httpv1alpha1.HTTPScaledObject ) (int32 , error ) {
73
- if httpso .Spec .ScaleTargetRef .Port != 0 {
74
- return httpso .Spec .ScaleTargetRef .Port , nil
82
+ func (rm * Routing ) getPort (ctx context.Context , httpso * httpv1alpha1.HTTPScaledObject , reference httpv1alpha1.Ref ) (int32 , error ) {
83
+ var (
84
+ port int32 = reference .GetPort ()
85
+ portName string = reference .GetPortName ()
86
+ serviceName string = reference .GetServiceName ()
87
+ )
88
+
89
+ if port != 0 {
90
+ return port , nil
75
91
}
76
- if httpso . Spec . ScaleTargetRef . PortName == "" {
92
+ if portName == "" {
77
93
return 0 , fmt .Errorf (`must specify either "port" or "portName"` )
78
94
}
79
- svc , err := rm .svcCache .Get (ctx , httpso .GetNamespace (), httpso . Spec . ScaleTargetRef . Service )
95
+ svc , err := rm .svcCache .Get (ctx , httpso .GetNamespace (), serviceName )
80
96
if err != nil {
81
97
return 0 , fmt .Errorf ("failed to get Service: %w" , err )
82
98
}
83
99
for _ , port := range svc .Spec .Ports {
84
- if port .Name == httpso . Spec . ScaleTargetRef . PortName {
100
+ if port .Name == portName {
85
101
return port .Port , nil
86
102
}
87
103
}
88
- return 0 , fmt .Errorf ("portName %q not found in Service" , httpso . Spec . ScaleTargetRef . PortName )
104
+ return 0 , fmt .Errorf ("portName %q not found in Service" , portName )
89
105
}
90
106
91
- func (rm * Routing ) streamFromHTTPSO (ctx context.Context , httpso * httpv1alpha1.HTTPScaledObject ) (* url.URL , error ) {
92
- port , err := rm .getPort (ctx , httpso )
107
+ func (rm * Routing ) streamFromHTTPSO (ctx context.Context , httpso * httpv1alpha1.HTTPScaledObject , reference httpv1alpha1. Ref ) (* url.URL , error ) {
108
+ port , err := rm .getPort (ctx , httpso , reference )
93
109
if err != nil {
94
110
return nil , fmt .Errorf ("failed to get port: %w" , err )
95
111
}
96
112
if rm .tlsEnabled {
97
113
return url .Parse (fmt .Sprintf (
98
114
"https://%s.%s:%d" ,
99
- httpso . Spec . ScaleTargetRef . Service ,
115
+ reference . GetServiceName () ,
100
116
httpso .GetNamespace (),
101
117
port ,
102
118
))
103
119
}
104
120
//goland:noinspection HttpUrlsUsage
105
121
return url .Parse (fmt .Sprintf (
106
122
"http://%s.%s:%d" ,
107
- httpso . Spec . ScaleTargetRef . Service ,
123
+ reference . GetServiceName () ,
108
124
httpso .GetNamespace (),
109
125
port ,
110
126
))
0 commit comments