go-jamming/rest/utils.go

87 lines
2.5 KiB
Go

package rest
import (
"encoding/json"
"fmt"
"net/http"
"net/url"
"strings"
)
// mimicing NotFound: https://golang.org/src/net/http/server.go?s=64787:64830#L2076
func BadRequest(w http.ResponseWriter) {
http.Error(w, http.StatusText(http.StatusBadRequest), http.StatusBadRequest)
}
func TooManyRequests(w http.ResponseWriter) {
http.Error(w, http.StatusText(http.StatusTooManyRequests), http.StatusTooManyRequests)
}
func Unauthorized(w http.ResponseWriter) {
http.Error(w, http.StatusText(http.StatusUnauthorized), http.StatusUnauthorized)
}
// Domain parses the target url to extract the domain as part of the allowed webmention targets.
// This is the same as conf.FetchDomain(wm.Target), only without config, and without error handling.
// Assumes http(s) protocol, which should have been validated by now.
func Domain(target string) string {
withPossibleSubdomain := strings.Split(target, "/")[2]
split := strings.Split(withPossibleSubdomain, ".")
if len(split) == 2 {
return withPossibleSubdomain // that was the extension, not the subdomain.
}
return fmt.Sprintf("%s.%s", split[1], split[2])
}
type imageType []byte
var (
jpg = imageType{0xFF, 0xD8}
bmp = imageType{0x42, 0x4D}
gif = imageType{0x47, 0x49, 0x46}
png = imageType{0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A}
tiffI = imageType{0x49, 0x49, 0x2A, 0x00}
tiffM = imageType{0x4D, 0x4D, 0x00, 0x2A}
webp = imageType{0x52, 0x49, 0x46, 0x46} // RIFF 32 bits
supportedImageTypes = []imageType{jpg, png, gif, bmp, webp, tiffI, tiffM}
)
// IsRealImage checks the first few bytes of the provided data to see if it's a real image.
// Image headers supported: gif/jpg/png/webp/bmp
func IsRealImage(data []byte) bool {
if len(data) < 8 {
return false
}
for _, imgType := range supportedImageTypes {
checkedBits := 0
for i, bit := range imgType {
if data[i] == bit {
checkedBits++
}
}
if checkedBits == len(imgType) {
return true
}
}
return false
}
func Json(w http.ResponseWriter, data interface{}) {
w.WriteHeader(200)
bytes, _ := json.MarshalIndent(data, "", " ")
w.Write(bytes)
}
func Accept(w http.ResponseWriter) {
w.WriteHeader(202)
w.Write([]byte("Thanks, bro. Will process this soon, pinky swear!"))
}
// assumes the URL is well-formed.
func BaseUrlOf(link string) *url.URL {
obj, _ := url.Parse(link)
baseUrl, _ := url.Parse(obj.Scheme + "://" + obj.Host)
return baseUrl
}