Atina'e 'upega tafa'ilagi i Golang - mai le faigofie i le lavelave

Atina'e 'upega tafa'ilagi i Golang - mai le faigofie i le lavelave

I le lima tausaga talu ai na ou amata ai atiina ae Gophish, na maua ai se avanoa e aʻoaʻo ai Golang. Na ou iloa o le Go o se gagana mamana, faʻapipiʻiina e le tele o faletusi. O le alu e sili ona lelei: aemaise lava, e mafai ona faʻaaogaina e atiaʻe ai talosaga i le itu-aumau e aunoa ma ni faʻafitauli.

O lenei tusiga e uiga i le tusiaina o se server i Go. Sei o tatou amata i mea faigofie e pei o le "Talofa lalolagi!" ma faaiʻu i se tusi talosaga ma mea nei:

- Fa'aaogā Let's Encrypt mo HTTPS.
- Galulue ose API router.
- Galulue ma middleware.
- Fa'atonuina o faila fa'amau.
— Tapuni sa'o.

Ua fautuaina e Skillbox: Kosi fa'ata'ita'i "Python developer mai le amataga".

Matou te faʻamanatu atu ia te oe: mo tagata faitau uma o le "Habr" - o se faʻaitiitiga o 10 rubles pe a lesitala i soʻo se vasega Skillbox e faʻaaoga ai le code promotional "Habr".

Talofa, lalolagi!

E mafai ona e fatuina se 'upega tafaʻilagi i Go i le vave tele. O se faʻataʻitaʻiga lea o le faʻaaogaina o se tagata e faʻafoʻi mai le "Talofa, lalolagi!" folafola i luga.

package main
 
import (
"fmt"
"net/http"
)
 
func main() {
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello World!")
})
http.ListenAndServe(":80", nil)
}

A maeʻa lenei, pe afai e te taʻavale le talosaga ma tatala le itulau localhost, ona e iloa loa lea o le mau “Talofa, lalolagi!” (pe a lelei mea uma, ioe).

O le a matou faʻaaogaina le faʻaulu i le tele o taimi mulimuli ane, ae muamua seʻi o tatou malamalama pe faʻafefea mea uma.

upega/http

O le faʻataʻitaʻiga na faʻaaogaina le afifi net/http, o le meafaigaluega muamua i le Go mo le atinaʻeina o 'auʻaunaga ma tagata HTTP. Ina ia malamalama i le code, ia tatou malamalama i le uiga o elemene taua e tolu: http.Handler, http.ServeMux ma http.Server.

Pulea HTTP

A matou mauaina se talosaga, e suʻesuʻe e le tagata faʻatautaia ma faʻatupuina se tali. Fa'atonu i Go o lo'o fa'atinoina e fa'apea:

type Handler interface {
        ServeHTTP(ResponseWriter, *Request)
}

O le fa'ata'ita'iga muamua e fa'aaogaina le galuega fesoasoani http.HandleFunc. E afifi ai se isi galuega, lea e ave ai le http.ResponseWriter ma le http.Request i le ServeHTTP.

I se isi faaupuga, o loʻo tuʻuina atu le au faʻatautaia i Golang i se faʻaoga tasi, lea e maua ai le tele o filifiliga i le polokalame. O lea la, mo se faʻataʻitaʻiga, o le middleware e faʻaaogaina e faʻaaoga ai se tagata e faʻaaogaina, lea e fai muamua ai e ServeHTTP se mea ona taʻua lea o le ServeHTTP auala a se isi tagata faʻatau.

E pei ona taʻua i luga, naʻo le faʻatupuina o tali i talosaga. Ae o le a le tagata faʻapitoa e tatau ona faʻaaogaina i se taimi faapitoa i le taimi?

Talosaga Auala

Ina ia faia le filifiliga saʻo, faʻaaoga se HTTP multiplexer. I le tele o faletusi e taʻua o muxer poʻo le router, ae o mea uma lava e tasi. O le galuega a le multiplexer o le suʻesuʻeina lea o le ala talosaga ma filifili le tagata e talafeagai.

Afai e te manaʻomia le lagolago mo auala lavelave, e sili atu le faʻaogaina o faletusi lona tolu. O nisi o mea sili ona maualuga - korila/mux и alu-chi/chi, o nei faletusi e mafai ai ona faʻatinoina le gaioiga faʻapitoa e aunoa ma ni faʻafitauli. Faatasi ai ma la latou fesoasoani, e mafai ona e faʻapipiʻi le taʻavale wildcard ma faʻatino le tele o isi galuega. O lo latou lelei o le fesoʻotaʻi ma tagata masani HTTP. O se taunuuga, e mafai ona e tusia le code faigofie e mafai ona suia i le lumanaʻi.

O le galulue fa'atasi ai ma fa'alavelave lavelave i se tulaga masani o le a mana'omia ai ni fofo e le masani ai, ma o lenei mea e matua fa'alavelave ai le fa'aogaina o tagata fa'aletonu. Ina ia fatuina le tele o talosaga, o le tuʻufaʻatasia o le faletusi le aoga ma se router faigofie o le a lava.

Fa'atonuga o Fesili

E le gata i lea, matou te manaʻomia se vaega o le a "faʻalogo" mo fesoʻotaʻiga o loʻo oʻo mai ma toe faʻafeiloaʻi uma talosaga i le tagata saʻo. http.Server e faigofie ona taulimaina lenei galuega.

O loʻo faʻaalia i lalo o le server e nafa ma galuega uma e fesoʻotaʻi ma le faʻaogaina o fesoʻotaʻiga. O lenei, mo se faʻataʻitaʻiga, e galue i le faʻaogaina o le TLS protocol. Ina ia faʻatinoina le http.ListenAndServer call, o loʻo faʻaaogaina se faʻamaumauga HTTP masani.

Se'i o tatou va'ai i ni fa'ata'ita'iga sili atu ona lavelave.

Fa'aopoopo Let's Encrypt

Ona o le faaletonu, o la matou talosaga e alu i luga o le HTTP protocol, ae e fautuaina e faʻaaoga le HTTPS protocol. E mafai ona faia lenei mea e aunoa ma ni faʻafitauli ile Go. Afai na e mauaina se tusi faamaonia ma se ki patino, ona lava lea e lesitala ai ListenAndServeTLS ma le tusi sa'o ma faila autu.

http.ListenAndServeTLS(":443", "cert.pem", "key.pem", nil)

E mafai lava ona e faia lelei.

Tatou Faanatinati e maua ai tusi faamaonia e aunoa ma se totogi ma le faafouga otometi. Ina ia faʻaaogaina le tautua, e te manaʻomia se afifi autocert.

O le auala pito sili ona faigofie e faʻapipiʻi ai o le faʻaaogaina lea o le autocert.NewListener metotia faʻatasi ma le http.Serve. O le auala e mafai ai e oe ona maua ma faʻafouina tusi faamaonia TLS aʻo faʻatonuina e le server HTTP:

http.Serve(autocert.NewListener("example.com"), nil)

Afai tatou te tatalaina i le browser example.com, o le a matou maua se tali HTTPS "Talofa, lalolagi!"

Afai e te manaʻomia nisi faʻamatalaga auiliili, ona tatau lea ona e faʻaogaina le autocert.Manager manager. Ona matou faia lea o la matou lava http.Server faʻataʻitaʻiga (seia oʻo mai i le taimi nei matou te faʻaaogaina e ala i le faaletonu) ma faʻaopoopo le pule i le TLSConfig server:

m := &autocert.Manager{
Cache:      autocert.DirCache("golang-autocert"),
Prompt:     autocert.AcceptTOS,
HostPolicy: autocert.HostWhitelist("example.org", "www.example.org"),
}
server := &http.Server{
    Addr:      ":443",
    TLSConfig: m.TLSConfig(),
}
server.ListenAndServeTLS("", "")

Ole auala faigofie lea e fa'atino ai le lagolago atoa a le HTTPS ile fa'afouga fa'afouga otometi.

Fa'aopoopo auala fa'aaganu'u

O le router fa'aletonu o lo'o i totonu o le faletusi masani e lelei, ae e matua fa'avae. O le tele o talosaga e mana'omia ai auala e sili atu ona lavelave, e aofia ai auala faamoega ma wildcard, poʻo se faiga mo le faʻatulagaina o ala ma faʻamaufaʻailoga.

I lenei tulaga e aoga le faʻaaogaina o afifi korila/mux и alu-chi/chi. O le a tatou aʻoaʻoina pe faʻapefea ona galulue ma le mulimuli - o se faʻataʻitaʻiga o loʻo faʻaalia i lalo.

Tuuina atu le faila api/v1/api.go o loʻo i ai auala mo la matou API:

/ HelloResponse is the JSON representation for a customized message
type HelloResponse struct {
Message string `json:"message"`
}
 
// HelloName returns a personalized JSON message
func HelloName(w http.ResponseWriter, r *http.Request) {
name := chi.URLParam(r, "name")
response := HelloResponse{
Message: fmt.Sprintf("Hello %s!", name),
}
jsonResponse(w, response, http.StatusOK)
}
 
// NewRouter returns an HTTP handler that implements the routes for the API
func NewRouter() http.Handler {
r := chi.NewRouter()
r.Get("/{name}", HelloName)
return r
}

Matou te setiina le api/vq prefix mo auala i le faila autu.

Ona mafai lea ona matou faʻapipiʻiina lenei mea i le matou router autu i lalo o le api / v1 / prefix i tua i la matou talosaga autu:

// NewRouter returns a new HTTP handler that implements the main server routes
func NewRouter() http.Handler {
router := chi.NewRouter()
    router.Mount("/api/v1/", v1.NewRouter())
    return router
}
http.Serve(autocert.NewListener("example.com"), NewRouter())

O le faigofie o le galue a Go i auala lavelave e mafai ai ona faʻafaigofie le faʻatulagaina ma le tausiga o faʻaoga tetele ma faigata.

Galulue ma middleware

O le faʻatulagaina e aofia ai le afifiina o le tasi HTTP handler ma le isi, e mafai ai ona vave faia le faʻamaonia, faʻamalosi, logging, ma isi galuega.

E fai ma fa'ata'ita'iga, se'i o tatou va'ai i le http.Handler interface; o le a tatou fa'aaogaina e tusi ai se tagata e fa'aigoaina e fa'amaonia ai tagata fa'aoga auaunaga.

func RequireAuthentication(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        if !isAuthenticated(r) {
            http.Redirect(w, r, "/login", http.StatusTemporaryRedirect)
            return
        }
        // Assuming authentication passed, run the original handler
        next.ServeHTTP(w, r)
    })
}

O loʻo i ai isi tagata taʻavale, e pei o le chi, e faʻatagaina oe e faʻalautele le gaioiga middleware.

Galulue ma faila fa'amau

O le Go standard library e aofia ai le gafatia e galue ai i mea faʻapitoa, e aofia ai ata, JavaScript ma faila CSS. E mafai ona maua e ala i le galuega http.FileServer. E toe fa'afo'i mai se tagata e fa'asoaina faila mai se lisi fa'apitoa.

func NewRouter() http.Handler {
    router := chi.NewRouter()
    r.Get("/{name}", HelloName)
 
// Настройка раздачи статических файлов
staticPath, _ := filepath.Abs("../../static/")
fs := http.FileServer(http.Dir(staticPath))
    router.Handle("/*", fs)
    
    return r

E mautinoa lava le taua o le manatuaina o le http.Dir o loʻo faʻaalia mea o loʻo i totonu o le lisi pe afai e le o iai le faila autu index.html. I lenei tulaga, ina ia puipuia le lisi mai le faʻafefeteina, e tatau ona e faʻaogaina le afifi unindexed.

Tapuni sa'o

O loʻo iai foʻi se vaega e taʻua o le tapunia matagofie o le HTTP server. E mafai ona faia lenei mea i le faʻaogaina o le Shutdown() method. E amata le 'au'aunaga i se goroutine, ona fa'alogoina lea o le alalaupapa e maua ai se fa'ailo fa'alavelave. O le taimi lava e maua ai le faailo, e tape le server, ae leʻo vave, ae pe a maeʻa ni nai sekone.

handler := server.NewRouter()
srv := &http.Server{
    Handler: handler,
}
 
go func() {
srv.Serve(autocert.NewListener(domains...))
}()
 
// Wait for an interrupt
c := make(chan os.Signal, 1)
signal.Notify(c, os.Interrupt)
<-c
 
// Attempt a graceful shutdown
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
srv.Shutdown(ctx)

I le avea ai o se faaiuga

O le Go o se gagana mamana ma se faletusi masani masani lautele. O ona agava'a fa'aletonu e matua lautele, ma e mafai ona fa'aleleia i le fa'aogaina o feso'ota'iga - e mafai ai e oe ona atia'e sa'u HTTP fa'atuatuaina moni.

Ua fautuaina e Skillbox:

puna: www.habr.com

Faaopoopo i ai se faamatalaga