@@ -185,10 +185,11 @@ func (g *gateway) stopServer() error {
185
185
186
186
if g .isServerStarted {
187
187
g .isServerStarted = false
188
- ctx , cancel := context .WithTimeout (context .Background (), time .Second * 5 )
188
+ // don't wait for the server shutdown because we don't care for the requests to interrupt
189
+ ctx , cancel := context .WithTimeout (context .Background (), time .Duration (0 ))
189
190
defer cancel ()
190
- if err := g .server .Shutdown (ctx ); err != nil {
191
- return err
191
+ if err := g .server .Shutdown (ctx ); err != nil && ! errors . Is ( err , context . DeadlineExceeded ) {
192
+ log . Errorf ( "gateway stop error: %s" , err . Error ())
192
193
}
193
194
if err := g .listener .Close (); err != nil && ! errors .Is (err , net .ErrClosed ) {
194
195
return err
@@ -209,10 +210,16 @@ func (g *gateway) readLimitCh() {
209
210
210
211
// fileHandler gets file meta from the DB, gets the corresponding data from the IPFS and decrypts it
211
212
func (g * gateway ) fileHandler (w http.ResponseWriter , r * http.Request ) {
212
- g .limitCh <- struct {}{}
213
- defer g .readLimitCh ()
213
+ select {
214
+ case g .limitCh <- struct {}{}:
215
+ defer g .readLimitCh ()
216
+ case <- r .Context ().Done ():
217
+ // exit fast in case context is already done(e.g. server stopped or client canceled)
218
+ return
219
+ }
214
220
enableCors (w )
215
- ctx , cancel := context .WithTimeout (context .Background (), getFileTimeout )
221
+
222
+ ctx , cancel := context .WithTimeout (r .Context (), getFileTimeout )
216
223
defer cancel ()
217
224
file , reader , err := g .getFile (ctx , r )
218
225
if err != nil {
@@ -249,11 +256,16 @@ func (g *gateway) getFile(ctx context.Context, r *http.Request) (files.File, io.
249
256
250
257
// imageHandler gets image meta from the DB, gets the corresponding data from the IPFS and decrypts it
251
258
func (g * gateway ) imageHandler (w http.ResponseWriter , r * http.Request ) {
252
- g .limitCh <- struct {}{}
253
- defer g .readLimitCh ()
259
+ select {
260
+ case g .limitCh <- struct {}{}:
261
+ defer g .readLimitCh ()
262
+ case <- r .Context ().Done ():
263
+ // exit fast in case context is already done(e.g. server stopped or client canceled)
264
+ return
265
+ }
254
266
enableCors (w )
255
267
256
- ctx , cancel := context .WithTimeout (context . Background (), getFileTimeout )
268
+ ctx , cancel := context .WithTimeout (r . Context (), getFileTimeout )
257
269
defer cancel ()
258
270
259
271
file , reader , err := g .getImage (ctx , r )
0 commit comments