🔀 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
|
# 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
|
## 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");
|
let resp = await fetch("http://localhost:8080/451");
|
||||||
console.log(resp.status); // 451
|
console.log(resp.status); // 451
|
||||||
console.log(resp.statusText); // Unavailable for Legal Reasons
|
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
|
## Deployment
|
||||||
|
|
||||||
I'll leave this as an exercise for the reader.
|
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
|
module codeberg.org/danjones000/http-go-status
|
||||||
|
|
||||||
go 1.21.4
|
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=
|
|
||||||
42
main.go
42
main.go
|
|
@ -23,15 +23,14 @@ import (
|
||||||
"os"
|
"os"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"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 := w.Header()
|
||||||
header.Set("Access-Control-Allow-Origin", "*")
|
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)
|
fmt.Printf("Got %s status\n", status)
|
||||||
if status == "" {
|
if status == "" {
|
||||||
status = "200"
|
status = "200"
|
||||||
|
|
@ -52,37 +51,18 @@ func Status(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {
|
||||||
w.WriteHeader(ret)
|
w.WriteHeader(ret)
|
||||||
}
|
}
|
||||||
|
|
||||||
func GetRouter() *httprouter.Router {
|
func HandleCors(w http.ResponseWriter, r *http.Request) {
|
||||||
router := httprouter.New()
|
fmt.Println("handling CORS")
|
||||||
|
|
||||||
// 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)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Handle CORS preflight requests
|
|
||||||
router.GlobalOPTIONS = http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
||||||
if r.Header.Get("Access-Control-Request-Method") != "" {
|
if r.Header.Get("Access-Control-Request-Method") != "" {
|
||||||
// Set CORS headers
|
// Set CORS headers
|
||||||
header := w.Header()
|
header := w.Header()
|
||||||
header.Set("Access-Control-Allow-Methods", header.Get("Allow"))
|
header.Set("Access-Control-Allow-Methods", "*")
|
||||||
header.Set("Access-Control-Allow-Origin", "*")
|
header.Set("Access-Control-Allow-Origin", "*")
|
||||||
|
header.Set("Access-Control-Allow-Headers", "*")
|
||||||
}
|
}
|
||||||
|
|
||||||
// Adjust status code to 204
|
// Adjust status code to 204
|
||||||
w.WriteHeader(http.StatusNoContent)
|
w.WriteHeader(http.StatusNoContent)
|
||||||
})
|
|
||||||
|
|
||||||
return router
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func GetPort() string {
|
func GetPort() string {
|
||||||
|
|
@ -100,5 +80,11 @@ func GetPort() string {
|
||||||
func main() {
|
func main() {
|
||||||
port := GetPort()
|
port := GetPort()
|
||||||
fmt.Printf("Listening on %s\n", port)
|
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