Extended http contains functions not included in golang standard library, yet useful for speed of development.
Performs graceful shutdown of http.Server
package main
import (
"fmt"
"net/http"
"os"
"github.com/prathoss/xhttp"
)
func main() {
s := &http.Server{
Addr: ":8080",
}
if err := xhttp.ServeWithShutdown(s); err != nil {
fmt.Println(err)
os.Exit(1)
}
}xhttp.Handler implements http.Handler and allows returning error which are translated to status codes.
package main
import (
"net/http"
"github.com/prathoss/xhttp"
)
func main() {
mux := http.NewServeMux()
mux.Handle("GET /", xhttp.HttpHandler(func(w http.ResponseWriter, r *http.Request) (any, error) {
return nil, nil
}))
mux.Handle("GET /not-found", xhttp.HttpHandler(func(w http.ResponseWriter, r *http.Request) (any, error) {
return nil, xhttp.NewNotFoundError("not found message")
}))
}In previous example the / path will return status 204 No content.
The /not-found will return status 404 Not found
Content-Type: application/problem+json
{
"status": 404,
"type": "https://datatracker.ietf.org/doc/html/rfc7231#section-6.5.4",
"title": "not found message"
}
Custom errors with status code and body can be created, by implementing xhttp.HttpProblemWriter and error interface.
Logs requests and response parameters with log/slog package.
package main
import (
"net/http"
"github.com/prathoss/xhttp"
"github.com/prathoss/xhttp/middleware"
)
func main() {
mux := http.NewServeMux()
mux.Handle("GET /", xhttp.HttpHandler(func(w http.ResponseWriter, r *http.Request) (any, error) {
return nil, nil
}))
s := &http.Server{
Addr: ":8080",
Handler: middleware.LoggingHandler(mux),
}
s.ListenAndServe()
}