Как удалить промежуточное ПО stati c по запросу? - PullRequest
1 голос
/ 01 февраля 2020

Я хочу, чтобы домашняя страница перестала быть доступной после публикации запроса. Вот мой код. Заранее спасибо.

package main
import(
    "github.com/gin-contrib/static"
    "github.com/gin-gonic/gin"
)

func main() {
   r := gin.Default()
   r.Use(static.Serve("/", static.LocalFile("./pages/home", true)))
   r.POST("/example", func(c *gin.Context) {
      //here I would like to stop serving the static files on a POST request
   })
   r.Run(":8080")
}

Моя структура каталогов

-main.go
-pages
   -home
      -index.html

1 Ответ

2 голосов
/ 01 февраля 2020

Я не эксперт по gin, но он похож на echo, поэтому я создал фрагмент для вас, чтобы проверить, соответствует ли он вашим потребностям.

Похоже, что невозможно отсоединить промежуточное программное обеспечение после присоединенного , как описано здесь , поэтому я могу проверять глобальную переменную для каждого запроса, чтобы увидеть, доступен ли ресурс.

package main

import (
    "net/http"
    "sync/atomic"

    "github.com/gin-contrib/static"
    "github.com/gin-gonic/gin"
)

// using atomic package instead of using mutexes looks better in this scope
var noIndex int32

func indexMiddleware() gin.HandlerFunc {
    hdl := static.Serve("/", static.LocalFile("./pages/home", true))
    return func(c *gin.Context) {
        if atomic.LoadInt32(&noIndex) == 0 {
            hdl(c)
            // if you have additional middlewares, let them run
            c.Next()
            return
        }
        c.AbortWithStatus(http.StatusBadRequest)
    }
}

func main() {
    r := gin.Default()
    r.Use(indexMiddleware())
    r.POST("/example", func(c *gin.Context) {
        atomic.CompareAndSwapInt32(&noIndex, 0, 1)
        c.String(http.StatusOK, "OK")
    })
    r.Run(":8080")
}
...