Files
root-me-api/internal/anubis/http_helpers.go
T
mycroft cf961ab94f
build / test (push) Successful in 9s
build / build (push) Successful in 10s
build / build-image (push) Successful in 1m4s
feat: initial commit
2026-06-04 14:19:37 +02:00

53 lines
1.6 KiB
Go

package anubis
import (
"bytes"
"io"
"net/http"
"net/url"
"strings"
)
// resolveRef resolves a (possibly relative) URL reference against a base URL,
// preserving the base's scheme and host. Anubis's preact redir is host-relative
// (e.g. "/.within.website/...").
func resolveRef(base *url.URL, ref string) *url.URL {
u, err := url.Parse(ref)
if err != nil {
// Fall back to a copy of base; the caller's cookie check will catch it.
c := *base
return &c
}
return base.ResolveReference(u)
}
// maybeHTML reports whether a response could be an HTML page (and thus possibly
// an Anubis interstitial). Non-HTML responses are passed through untouched.
func maybeHTML(resp *http.Response) bool {
ct := resp.Header.Get("Content-Type")
if ct == "" {
return true // unknown; be safe and inspect
}
return strings.Contains(strings.ToLower(ct), "text/html")
}
// withBody returns resp with its body replaced by an in-memory reader over b,
// so the (already consumed) body can be read again by the caller.
func withBody(resp *http.Response, b []byte) *http.Response {
resp.Body = io.NopCloser(bytes.NewReader(b))
resp.ContentLength = int64(len(b))
resp.Header.Del("Content-Length")
return resp
}
// applyCookies replaces the request's Cookie header with the cookies the shared
// jar holds for the request URL. The replayed request goes through the base
// transport directly (bypassing the client jar), so we must attach the freshly
// obtained auth cookie ourselves.
func (t *Transport) applyCookies(req *http.Request) {
req.Header.Del("Cookie")
for _, c := range t.Jar.Cookies(req.URL) {
req.AddCookie(c)
}
}