85d2ea6143
- Data types (SManga, SChapter, Page, MangasPage, all Filter variants) - Source interfaces (Source, CatalogueSource) with MD5-based ID generation matching Tachiyomi/Suwayomi - HTTP client with per-host rate limiting, cookie jar, and 429 retry - FlareSolverr v1 client (FLARESOLVERR_URL env) - Generic GraphQL POST helper - goquery HTML parser wrappers - Source registry (panics on duplicate ID) - Multi-stage Dockerfile (golang:1.26-alpine + distroless) and compose.yml (postgres, flaresolverr, app)
43 lines
1.1 KiB
Go
43 lines
1.1 KiB
Go
package httpclient
|
|
|
|
const (
|
|
androidUA = "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Mobile Safari/537.36"
|
|
desktopUA = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36"
|
|
)
|
|
|
|
func AndroidUA() string { return androidUA }
|
|
func DesktopUA() string { return desktopUA }
|
|
|
|
func JSONHeaders() map[string]string {
|
|
return map[string]string{
|
|
"Content-Type": "application/json",
|
|
"Accept": "application/json",
|
|
}
|
|
}
|
|
|
|
func FormHeaders() map[string]string {
|
|
return map[string]string{
|
|
"Content-Type": "application/x-www-form-urlencoded",
|
|
}
|
|
}
|
|
|
|
func WithRefererHeader(headers map[string]string, referer string) map[string]string {
|
|
out := clone(headers)
|
|
out["Referer"] = referer
|
|
return out
|
|
}
|
|
|
|
func WithOrigin(headers map[string]string, origin string) map[string]string {
|
|
out := clone(headers)
|
|
out["Origin"] = origin
|
|
return out
|
|
}
|
|
|
|
func clone(m map[string]string) map[string]string {
|
|
out := make(map[string]string, len(m)+1)
|
|
for k, v := range m {
|
|
out[k] = v
|
|
}
|
|
return out
|
|
}
|