🔀 Merge branch 'rel/0.2.0' into prod
This commit is contained in:
commit
fd6103219f
4 changed files with 29 additions and 39 deletions
10
README.md
10
README.md
|
|
@ -1,6 +1,8 @@
|
|||
# http-go-status
|
||||
|
||||
Inspired by [httpstatu.us](https://github.com/aaronpowell/httpstatus), but written in Go, and is almost as minimal as possible. Only a signle dependency, and less than 100 lines of code in a single file.
|
||||
Inspired by [httpstatu.us](https://github.com/aaronpowell/httpstatus), but written in Go, and is as minimal as possible. No third party dependencies, and less than 100 lines of code in a single file.
|
||||
|
||||
Previous versions had a single third-party dependency, but that's no longer necessary.
|
||||
|
||||
## Installation
|
||||
|
||||
|
|
@ -22,8 +24,14 @@ To make your request from within a web browser (CORS is supported), you could do
|
|||
let resp = await fetch("http://localhost:8080/451");
|
||||
console.log(resp.status); // 451
|
||||
console.log(resp.statusText); // Unavailable for Legal Reasons
|
||||
|
||||
resp = await fetch("http://localhost:8080/418/path/to/nothing");
|
||||
console.log(resp.status); // 418
|
||||
console.log(resp.statusText); // I'm a teapot
|
||||
```
|
||||
|
||||
If there is no path, if the first element in the path is not an integer, or if it's an integer outside of the acceptable range, a 200 will be returned.
|
||||
|
||||
## Deployment
|
||||
|
||||
I'll leave this as an exercise for the reader.
|
||||
|
|
|
|||
2
go.mod
2
go.mod
|
|
@ -1,5 +1,3 @@
|
|||
module codeberg.org/danjones000/http-go-status
|
||||
|
||||
go 1.21.4
|
||||
|
||||
require github.com/julienschmidt/httprouter v1.3.0
|
||||
|
|
|
|||
2
go.sum
2
go.sum
|
|
@ -1,2 +0,0 @@
|
|||
github.com/julienschmidt/httprouter v1.3.0 h1:U0609e9tgbseu3rBINet9P48AI/D3oJs4dN7jwJOQ1U=
|
||||
github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=
|
||||
54
main.go
54
main.go
|
|
@ -23,15 +23,14 @@ import (
|
|||
"os"
|
||||
"strconv"
|
||||
"strings"
|
||||
|
||||
"github.com/julienschmidt/httprouter"
|
||||
)
|
||||
|
||||
func Status(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {
|
||||
func Status(w http.ResponseWriter, r *http.Request) {
|
||||
header := w.Header()
|
||||
header.Set("Access-Control-Allow-Origin", "*")
|
||||
|
||||
status := ps.ByName("status")
|
||||
status := strings.TrimLeft(r.RequestURI, "/")
|
||||
status, _, _ = strings.Cut(status, "/")
|
||||
fmt.Printf("Got %s status\n", status)
|
||||
if status == "" {
|
||||
status = "200"
|
||||
|
|
@ -52,37 +51,18 @@ func Status(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {
|
|||
w.WriteHeader(ret)
|
||||
}
|
||||
|
||||
func GetRouter() *httprouter.Router {
|
||||
router := httprouter.New()
|
||||
|
||||
// We don't handle OPTIONS, so that we can support CORS
|
||||
methods := [8]string{
|
||||
http.MethodGet,
|
||||
http.MethodHead,
|
||||
http.MethodPost,
|
||||
http.MethodPut,
|
||||
http.MethodPatch,
|
||||
http.MethodDelete,
|
||||
http.MethodConnect,
|
||||
http.MethodTrace}
|
||||
for _, method := range methods {
|
||||
router.Handle(method, "/:status", Status)
|
||||
func HandleCors(w http.ResponseWriter, r *http.Request) {
|
||||
fmt.Println("handling CORS")
|
||||
if r.Header.Get("Access-Control-Request-Method") != "" {
|
||||
// Set CORS headers
|
||||
header := w.Header()
|
||||
header.Set("Access-Control-Allow-Methods", "*")
|
||||
header.Set("Access-Control-Allow-Origin", "*")
|
||||
header.Set("Access-Control-Allow-Headers", "*")
|
||||
}
|
||||
|
||||
// Handle CORS preflight requests
|
||||
router.GlobalOPTIONS = http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||
if r.Header.Get("Access-Control-Request-Method") != "" {
|
||||
// Set CORS headers
|
||||
header := w.Header()
|
||||
header.Set("Access-Control-Allow-Methods", header.Get("Allow"))
|
||||
header.Set("Access-Control-Allow-Origin", "*")
|
||||
}
|
||||
|
||||
// Adjust status code to 204
|
||||
w.WriteHeader(http.StatusNoContent)
|
||||
})
|
||||
|
||||
return router
|
||||
// Adjust status code to 204
|
||||
w.WriteHeader(http.StatusNoContent)
|
||||
}
|
||||
|
||||
func GetPort() string {
|
||||
|
|
@ -100,5 +80,11 @@ func GetPort() string {
|
|||
func main() {
|
||||
port := GetPort()
|
||||
fmt.Printf("Listening on %s\n", port)
|
||||
log.Fatal(http.ListenAndServe(port, GetRouter()))
|
||||
log.Fatal(http.ListenAndServe(port, http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||
if r.Method == http.MethodOptions {
|
||||
HandleCors(w, r)
|
||||
} else {
|
||||
Status(w, r)
|
||||
}
|
||||
})))
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue