为了账号安全,请及时绑定邮箱和手机立即绑定

启动Go HTTP服务器,做一些事情,然后在任务完成后将其关闭

启动Go HTTP服务器,做一些事情,然后在任务完成后将其关闭

Go
墨色风雨 2022-08-09 20:32:25
我正在从 CLI 应用程序设置 OAuth2 流,我正在处理。我需要为提供商创建一个临时HTTP服务器以发送回调,例如localhost:8080/callback一旦提供商发送了我需要的详细信息,我希望能够关闭HTTP服务器,只是为了保持一切干净。我想我正在寻找的是例程和等待组,但我对这个领域仍然很陌生。这就是我到目前为止所拥有的。我已经编辑了将用户发送到提供程序的部分,因为我的主要问题只是如何在捕获变量后关闭HTTP服务器。token服务器启动将用户定向到提供程序站点上的授权 URL用户批准请求提供程序将用户定向回localhost:8080/callbackURL仅包含客户端参数,因此我必须使用服务器HTML来捕获值并将其发送回服务器服务器接收令牌,然后可以关闭package mainimport (    "fmt"    "log"    "net/http"    "sync")func main() {    // Start local HTTP serevr to listen for response    serverDone := &sync.WaitGroup{}    serverDone.Add(1)    Start(serverDone)    // ... Process to start OAuth2 flow    // User is directed to provider website    // User approves    // Provider direct user back to localhost/callback        serverDone.Wait()}func Start(wg *sync.WaitGroup) {    srv := &http.Server{Addr: ":8080"}    http.HandleFunc("/callback", func(w http.ResponseWriter, r *http.Request) {        token := r.URL.Query().Get("token")        if token != "" {            fmt.Println("Found Token:", token)            // Shut down server here        } else {            // Server HTML page to fetch token and return to server at /callback        }    })    go func() {        // let main know we are done cleaning up        defer wg.Done()        // ErrServerClosed on graceful close        if err := srv.ListenAndServe(); err != http.ErrServerClosed {            log.Fatalf("ListenAndServe(): %v", err)        }    }()}
查看完整描述

1 回答

?
慕妹3242003

TA贡献1824条经验 获得超6个赞

用:


var ctxShutdown, cancel = context.WithCancel(context.Background())

然后:


cancel() // to say sorry, above.

// graceful-shutdown

err := srv.Shutdown(context.Background())

试试这个:


package main


import (

    "context"

    "fmt"

    "log"

    "net/http"

    "sync"

)


func main() {

    serverDone := &sync.WaitGroup{}

    serverDone.Add(1)

    Start(serverDone)

    serverDone.Wait()

    fmt.Println("Done that.")

}


var ctxShutdown, cancel = context.WithCancel(context.Background())


func Start(wg *sync.WaitGroup) {

    srv := &http.Server{Addr: ":8080"}

    http.HandleFunc("/callback", func(w http.ResponseWriter, r *http.Request) {

        select {

        case <-ctxShutdown.Done():

            fmt.Println("Sorry: Shuting down ...")

            return

        default:

        }

        token := r.URL.Query().Get("token")

        if token != "" {

            fmt.Println("Found Token:", token)

            fmt.Println("Shuting down ...")

            // Shut down server here

            cancel() // to say sorry, above.

            // graceful-shutdown

            err := srv.Shutdown(context.Background())

            if err != nil {

                log.Println("server.Shutdown:", err)

            }


        } else {

            fmt.Fprintln(w, "Hi") // Server HTML page to fetch token and return to server at /callback

        }

    })


    go func() {

        defer wg.Done()

        if err := srv.ListenAndServe(); err != http.ErrServerClosed {

            log.Fatalf("ListenAndServe(): %v", err)

        }

        fmt.Println("Bye.")

    }()

}


运行并打开 http://127.0.0.1:8080/callback?token=2


输出:


Found Token: 2

Shuting down ...

Bye.

Done that.


查看完整回答
反对 回复 2022-08-09
  • 1 回答
  • 0 关注
  • 118 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信