Volodymyr Tkach e2c616def5 Update README.md | 2 years ago | |
---|---|---|
.github | 2 years ago | |
utils | 2 years ago | |
LICENSE | 2 years ago | |
Makefile | 2 years ago | |
README.md | 2 years ago | |
go.mod | 2 years ago | |
go.sum | 2 years ago |
Different kind of functions for second reusage
Web server, which can use regular expressions in path. Designed to be simple for projects with API
package base
import (
"net/http"
...
)
type Handler struct {
Ctx context.Context
DB *database.DataBase
Shutdown context.CancelFunc
}
type ServerData struct {
...
}
func (h Handler) FuncMap(w http.ResponseWriter, r *http.Request) template.FuncMap {
return template.FuncMap{}
}
package page_index
import (
"net/http"
...
)
type Handler struct {
base.Handler
}
func (h Handler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
sess := h.SessionStart(w, r)
if sess == nil {
return
}
defer sess.Close()
// /api/v1/aliases/{i}
// apiserv.GetParams(r)[1].Integer()
// /api/v1/aliases/{s}
// apiserv.GetParams(r)[1].String()
...
data := &base.ServerData{}
if !render.HTML(w, r, h.FuncMap(w, r), data, web.IndexHtml, http.StatusOK) {
return
}
}
package server
import (
"net/http"
...
)
func NewMux(ctx context.Context, shutdown context.CancelFunc, db *database.DataBase) *apiserv.ServeMux {
mux := apiserv.NewServeMux()
handler := base.Handler{
Ctx: ctx,
DB: db,
Shutdown: shutdown,
}
// Pages
mux.Get("/", page_index.Handler{Handler: handler})
mux.Get("/about", page_about.Handler{Handler: handler})
// API
mux.Get("/api/v1/app/health", v1_app_health.Handler{Handler: handler})
mux.Handle("/api/v1/aliases", []string{http.MethodGet, http.MethodPost}, v1_aliases.Handler{Handler: handler})
mux.Handle("/api/v1/aliases/{i}", []string{http.MethodGet, http.MethodPut, http.MethodDelete}, v1_aliases.Handler{Handler: handler})
// Assets
mux.Get("/favicon.png", helpers.HandleImagePng(web.FaviconPng))
mux.Get("/robots.txt", helpers.HandleTextPlain(web.RobotsTxt))
mux.Get("/sitemap.xml", helpers.HandleTextXml(web.SitemapXml))
// 404
mux.NotFound(page_404.Handler{Handler: handler})
return mux
}
func New(ctx context.Context, shutdown context.CancelFunc, db *database.DataBase) (*http.Server, error) {
mux := NewMux(ctx, shutdown, db)
srv := &http.Server{
Addr: consts.Config.Host + ":" + consts.Config.Port,
Handler: mux,
}
go func() {
fmt.Printf("Web server: http://%s:%s/\n", consts.Config.Host, consts.Config.Port)
if err := srv.ListenAndServe(); err != nil {
if err != http.ErrServerClosed {
fmt.Printf("Web server startup error: %s\n", err.Error())
shutdown()
return
}
}
}()
return srv, nil
}
type CurlGetOpts struct {
ExpectStatusCode int
Headers map[string][]string
Timeout time.Duration
}
func CurlDownload(ctx context.Context, url string, opts *CurlGetOpts, fileName string, filePath ...string) error
func CurlGet(ctx context.Context, url string, opts *CurlGetOpts) ([]byte, error)