@@ -9,9 +9,12 @@ import (
9
9
"io"
10
10
"log"
11
11
"net/http"
12
+ "net/http/httputil"
12
13
"os"
14
+ "strings"
13
15
"time"
14
16
17
+ fhttputil "github.com/openfaas/faas-provider/httputil"
15
18
"github.com/openfaas/faas/gateway/pkg/middleware"
16
19
"github.com/openfaas/faas/gateway/types"
17
20
)
@@ -28,7 +31,10 @@ func MakeForwardingProxyHandler(proxy *types.HTTPClientReverseProxy,
28
31
writeRequestURI = exists
29
32
}
30
33
34
+ reverseProxy := makeRewriteProxy (baseURLResolver , urlPathTransformer )
35
+
31
36
return func (w http.ResponseWriter , r * http.Request ) {
37
+
32
38
baseURL := baseURLResolver .Resolve (r )
33
39
originalURL := r .URL .String ()
34
40
requestURL := urlPathTransformer .Transform (r )
@@ -39,13 +45,13 @@ func MakeForwardingProxyHandler(proxy *types.HTTPClientReverseProxy,
39
45
40
46
start := time .Now ()
41
47
42
- statusCode , err := forwardRequest (w , r , proxy .Client , baseURL , requestURL , proxy .Timeout , writeRequestURI , serviceAuthInjector )
43
-
44
- seconds := time .Since (start )
48
+ statusCode , err := forwardRequest (w , r , proxy .Client , baseURL , requestURL , proxy .Timeout , writeRequestURI , serviceAuthInjector , reverseProxy )
45
49
if err != nil {
46
50
log .Printf ("error with upstream request to: %s, %s\n " , requestURL , err .Error ())
47
51
}
48
52
53
+ seconds := time .Since (start )
54
+
49
55
for _ , notifier := range notifiers {
50
56
notifier .Notify (r .Method , requestURL , originalURL , statusCode , "completed" , seconds )
51
57
}
@@ -86,7 +92,12 @@ func forwardRequest(w http.ResponseWriter,
86
92
requestURL string ,
87
93
timeout time.Duration ,
88
94
writeRequestURI bool ,
89
- serviceAuthInjector middleware.AuthInjector ) (int , error ) {
95
+ serviceAuthInjector middleware.AuthInjector ,
96
+ reverseProxy * httputil.ReverseProxy ) (int , error ) {
97
+
98
+ if r .Body != nil {
99
+ defer r .Body .Close ()
100
+ }
90
101
91
102
upstreamReq := buildUpstreamRequest (r , baseURL , requestURL )
92
103
if upstreamReq .Body != nil {
@@ -101,14 +112,20 @@ func forwardRequest(w http.ResponseWriter,
101
112
log .Printf ("forwardRequest: %s %s\n " , upstreamReq .Host , upstreamReq .URL .String ())
102
113
}
103
114
115
+ if strings .HasPrefix (r .Header .Get ("Accept" ), "text/event-stream" ) {
116
+ ww := fhttputil .NewHttpWriteInterceptor (w )
117
+ reverseProxy .ServeHTTP (ww , upstreamReq )
118
+ return ww .Status (), nil
119
+ }
120
+
104
121
ctx , cancel := context .WithTimeout (r .Context (), timeout )
105
122
defer cancel ()
106
123
107
- res , resErr := proxyClient .Do (upstreamReq .WithContext (ctx ))
108
- if resErr != nil {
124
+ res , err := proxyClient .Do (upstreamReq .WithContext (ctx ))
125
+ if err != nil {
109
126
badStatus := http .StatusBadGateway
110
127
w .WriteHeader (badStatus )
111
- return badStatus , resErr
128
+ return badStatus , err
112
129
}
113
130
114
131
if res .Body != nil {
@@ -117,12 +134,10 @@ func forwardRequest(w http.ResponseWriter,
117
134
118
135
copyHeaders (w .Header (), & res .Header )
119
136
120
- // Write status code
121
137
w .WriteHeader (res .StatusCode )
122
138
123
139
if res .Body != nil {
124
- // Copy the body over
125
- io .CopyBuffer (w , res .Body , nil )
140
+ io .Copy (w , res .Body )
126
141
}
127
142
128
143
return res .StatusCode , nil
@@ -159,3 +174,14 @@ var hopHeaders = []string{
159
174
"Transfer-Encoding" ,
160
175
"Upgrade" ,
161
176
}
177
+
178
+ func makeRewriteProxy (baseURLResolver middleware.BaseURLResolver , urlPathTransformer middleware.URLPathTransformer ) * httputil.ReverseProxy {
179
+ return & httputil.ReverseProxy {
180
+ ErrorLog : log .New (io .Discard , "proxy:" , 0 ),
181
+ Transport : http .DefaultClient .Transport ,
182
+ ErrorHandler : func (w http.ResponseWriter , r * http.Request , err error ) {
183
+ },
184
+ Director : func (r * http.Request ) {
185
+ },
186
+ }
187
+ }
0 commit comments