func runDelayedHandler(w http.ResponseWriter, r *http.Request) { h := context.GetDelayedHandler(r) if h != nil { h.ServeHTTP(w, r) } }
func (m *appLockMiddleware) ServeHTTP(w http.ResponseWriter, r *http.Request, next http.HandlerFunc) { if r.Method == "GET" { next(w, r) return } currentHandler := context.GetDelayedHandler(r) if currentHandler != nil { currentHandlerPtr := reflect.ValueOf(currentHandler).Pointer() for _, h := range m.excludedHandlers { if reflect.ValueOf(h).Pointer() == currentHandlerPtr { next(w, r) return } } } appName := r.URL.Query().Get(":app") if appName == "" { appName = r.URL.Query().Get(":appname") } if appName == "" { next(w, r) return } t := context.GetAuthToken(r) var owner string if t != nil { if t.IsAppToken() { owner = t.GetAppName() } else { owner = t.GetUserName() } } _, err := app.GetByName(appName) if err == app.ErrAppNotFound { context.AddRequestError(r, &errors.HTTP{Code: http.StatusNotFound, Message: err.Error()}) return } ok, err := app.AcquireApplicationLockWait(appName, owner, fmt.Sprintf("%s %s", r.Method, r.URL.Path), lockWaitDuration) if err != nil { context.AddRequestError(r, fmt.Errorf("Error trying to acquire application lock: %s", err)) return } if ok { defer func() { if !context.IsPreventUnlock(r) { app.ReleaseApplicationLock(appName) } }() next(w, r) return } a, err := app.GetByName(appName) httpErr := &errors.HTTP{Code: http.StatusInternalServerError} if err != nil { if err == app.ErrAppNotFound { httpErr.Code = http.StatusNotFound httpErr.Message = err.Error() } else { httpErr.Message = fmt.Sprintf("Error to get application: %s", err) } } else { httpErr.Code = http.StatusConflict if a.Lock.Locked { httpErr.Message = fmt.Sprintf("%s", &a.Lock) } else { httpErr.Message = "Not locked anymore, please try again." } } context.AddRequestError(r, httpErr) }