@@ -84,53 +84,63 @@ func apiURL(ctx netcontext.Context) *url.URL {
8484 }
8585}
8686
87- func handleHTTP (w http.ResponseWriter , r * http.Request ) {
88- c := & context {
89- req : r ,
90- outHeader : w .Header (),
91- }
92- r = r .WithContext (withContext (r .Context (), c ))
93- c .req = r
94-
95- // Patch up RemoteAddr so it looks reasonable.
96- if addr := r .Header .Get (userIPHeader ); addr != "" {
97- r .RemoteAddr = addr
98- } else if addr = r .Header .Get (remoteAddrHeader ); addr != "" {
99- r .RemoteAddr = addr
100- } else {
101- // Should not normally reach here, but pick a sensible default anyway.
102- r .RemoteAddr = "127.0.0.1"
103- }
104- // The address in the headers will most likely be of these forms:
105- // 123.123.123.123
106- // 2001:db8::1
107- // net/http.Request.RemoteAddr is specified to be in "IP:port" form.
108- if _ , _ , err := net .SplitHostPort (r .RemoteAddr ); err != nil {
109- // Assume the remote address is only a host; add a default port.
110- r .RemoteAddr = net .JoinHostPort (r .RemoteAddr , "80" )
111- }
112-
113- executeRequestSafely (c , r )
114- c .outHeader = nil // make sure header changes aren't respected any more
115-
116- // Avoid nil Write call if c.Write is never called.
117- if c .outCode != 0 {
118- w .WriteHeader (c .outCode )
119- }
120- if c .outBody != nil {
121- w .Write (c .outBody )
122- }
87+ // Middleware wraps an http handler so that it can make GAE API calls
88+ func Middleware (next http.Handler ) http.Handler {
89+ return handleHTTPMiddleware (executeRequestSafelyMiddleware (next ))
12390}
12491
125- func executeRequestSafely (c * context , r * http.Request ) {
126- defer func () {
127- if x := recover (); x != nil {
128- logf (c , 4 , "%s" , renderPanic (x )) // 4 == critical
129- c .outCode = 500
92+ func handleHTTPMiddleware (next http.Handler ) http.Handler {
93+ return http .HandlerFunc (func (w http.ResponseWriter , r * http.Request ) {
94+ c := & context {
95+ req : r ,
96+ outHeader : w .Header (),
97+ }
98+ r = r .WithContext (withContext (r .Context (), c ))
99+ c .req = r
100+
101+ // Patch up RemoteAddr so it looks reasonable.
102+ if addr := r .Header .Get (userIPHeader ); addr != "" {
103+ r .RemoteAddr = addr
104+ } else if addr = r .Header .Get (remoteAddrHeader ); addr != "" {
105+ r .RemoteAddr = addr
106+ } else {
107+ // Should not normally reach here, but pick a sensible default anyway.
108+ r .RemoteAddr = "127.0.0.1"
109+ }
110+ // The address in the headers will most likely be of these forms:
111+ // 123.123.123.123
112+ // 2001:db8::1
113+ // net/http.Request.RemoteAddr is specified to be in "IP:port" form.
114+ if _ , _ , err := net .SplitHostPort (r .RemoteAddr ); err != nil {
115+ // Assume the remote address is only a host; add a default port.
116+ r .RemoteAddr = net .JoinHostPort (r .RemoteAddr , "80" )
130117 }
131- }()
132118
133- http .DefaultServeMux .ServeHTTP (c , r )
119+ next .ServeHTTP (c , r )
120+ c .outHeader = nil // make sure header changes aren't respected any more
121+
122+ // Avoid nil Write call if c.Write is never called.
123+ if c .outCode != 0 {
124+ w .WriteHeader (c .outCode )
125+ }
126+ if c .outBody != nil {
127+ w .Write (c .outBody )
128+ }
129+ })
130+ }
131+
132+ func executeRequestSafelyMiddleware (next http.Handler ) http.Handler {
133+ return http .HandlerFunc (func (w http.ResponseWriter , r * http.Request ) {
134+ defer func () {
135+ if x := recover (); x != nil {
136+ c := w .(* context )
137+ logf (c , 4 , "%s" , renderPanic (x )) // 4 == critical
138+ c .outCode = 500
139+ }
140+ }()
141+
142+ next .ServeHTTP (w , r )
143+ })
134144}
135145
136146func renderPanic (x interface {}) string {
0 commit comments