Commit Graph
62 Commits
Author SHA1 Message Date
aykhans 51e8f2a57f fix(script): match the main request default for the script http timeout 2026-10-02 01:13:25 +04:00
aykhans bea48eeab0 docs: say that a dry run still sends a script's own requests 2026-10-01 22:43:24 +04:00
aykhans cd0fa453c2 fix(script): bound how deep json.encode walks a Lua table 2026-10-01 22:13:29 +04:00
aykhans 847c4b39ce fix(script): decode a compressed http() response body 2026-10-01 21:17:43 +04:00
aykhans 9e773a4e6c fix(script): reject a non-object headers, params or cookies in JavaScript 2026-09-30 21:18:50 +04:00
aykhans bcf2ea3446 fix(script): reject async/generator JS transforms and catch throwing getters 2026-09-30 19:53:37 +04:00
aykhans 4a14d57d15 fix(config): reject a hidden YAML document and drop Go types from errors 2026-09-30 12:29:00 +04:00
aykhans 633f548e7b fix(config): report YAML config errors more clearly 2026-09-30 01:07:28 +04:00
aykhans 68de415645 fix(config): reject unknown fields in a YAML config file 2026-09-30 00:14:51 +04:00
aykhans fb8443fd25 chore: read response headers into a 64KiB buffer instead of 4KiB 2026-09-29 23:40:57 +04:00
aykhans e0f6d4aeba fix: send an idempotent request once instead of retrying it five times 2026-09-29 23:22:51 +04:00
aykhans 17dfa16051 feat(script): add res.bytes() so JavaScript can read a binary body 2026-09-29 23:22:51 +04:00
aykhans a327c4978b fix: report one error text when a response body is too large 2026-09-29 23:06:22 +04:00
aykhans 9d6e4e6bf8 chore(template): raise the remote file timeout to 30s 2026-09-29 22:59:42 +04:00
aykhans 9c7b7c26a0 refactor(script): drop the per-call maxBodySize and its client cache 2026-09-29 10:58:25 +04:00
aykhans ef5907dc0c fix: cap body limits at 1GiB and key script clients by the exact size 2026-09-29 00:55:04 +04:00
aykhans 1956eb1c44 fix(script): enforce script body limits without streaming
Streaming accepted a chunked body cut at a chunk boundary as complete,
so the limit now comes from the client that reads the body, picked per
requested size. Script requests keep their own default, maxBodySize
accepts sizes like 10MiB, and files sarin downloads for itself are
capped at 64MiB.
2026-09-29 00:41:48 +04:00
aykhans f1d91e3d77 feat: limit response body sizes
fasthttp allocates the body from the declared Content-Length before
reading it, so a server could exhaust memory by declaring a size it
never sends. The new max response body config bounds every response,
defaults to 10MiB and accepts sizes like 10MiB or 2MB. Scripts get the
same as a maxBodySize option on http().
2026-09-28 22:49:39 +04:00
aykhans 8da05bb10c fix(stats): key generation failures by source and bound the key count 2026-09-27 01:03:04 +04:00
aykhans c32949c8e0 fix(script): convert non-string header, param and cookie values to text 2026-09-26 01:17:49 +04:00
aykhans a30c862936 fix(script): bind script HTTP requests to the run context 2026-09-25 22:34:20 +04:00
aykhans 5d91141f80 fix(script): stringify thrown JavaScript values through Runtime.Try 2026-09-24 22:34:59 +04:00
aykhans 878ca6dfbd fix(script): bound maxRedirects to 100 and reject out of range values 2026-09-24 19:08:58 +04:00
aykhans 9b0e7c4304 fix: dial IPv6 hosts by enabling dual-stack and trying every resolved address 2026-09-23 01:03:42 +04:00
aykhans d4c7dcc42c fix: apply per-request timeouts to script HTTP proxy dials 2026-09-23 00:45:44 +04:00
aykhans 00226b0eb7 fix: size script HTTP client connection pool to worker count 2026-09-22 19:29:51 +04:00
aykhans 529420ee5a feat(script): replace followRedirects with maxRedirects http option 2026-09-20 23:18:21 +04:00
aykhans 8b437b487c feat(script): add http() and json to Lua and JS scripts 2026-09-20 23:02:51 +04:00
aykhans 5ca9cda2b9 docs(cli): show config-file flag type as []string in help text 2026-09-19 00:14:48 +04:00
aykhans 6b03ba9579 refactor(sarin): extract cookie header building into cookieHeaderValue 2026-09-18 22:39:56 +04:00
aykhans 082851d25e feat: expose additional gofakeit functions 2026-09-11 20:03:42 +04:00
aykhans 9602595216 perf: batch TUI log forwarding on a 250ms tick instead of one repaint per line 2026-08-17 20:46:33 +04:00
aykhans c195ca2ab2 refactor: print stderr via fmt.Fprint with lipgloss.Sprintln instead of lipgloss.Fprintln 2026-08-17 20:11:47 +04:00
aykhans e13eb9b8a8 fix: treat zero-sized ptys as non-interactive 2026-08-17 19:11:55 +04:00
aykhans d68c557dd3 fix: restore pre-v2 progress bar fill and viewport scroll behavior 2026-08-17 18:57:33 +04:00
aykhans d08b6dc222 refactor: migrate Charm libraries to v2
Import paths moved to charm.land/*/v2 and the v1 paths no longer resolve.
Ports View() -> tea.View, AltScreen/MouseMode to View fields, KeyPressMsg,
and the new progress/viewport constructors. Styled output outside Bubble
Tea switched to lipgloss.Print* because v2 downsamples colour at the output
layer. vendorHash refreshed.
2026-08-17 17:21:13 +04:00
aykhans e83e9346a3 perf: drop redundant resp.Reset in worker loops
fasthttp resets the response at the top of every HostClient.Do, so
resetting it in the worker loop only repeats that work once per request.
2026-08-10 00:10:27 +04:00
aykhans 01b5233167 perf: replace status code string map with an indexed table 2026-08-10 00:01:16 +04:00
aykhans 755545d838 perf: cut per-request allocations in the request generator
- Reuse value slices in place instead of clear()+realloc when a map's
  key set is static (skipped when scripts may mutate the maps).
- Use SetBodyString to drop the []byte(Body) copy, build the Cookie
  header with a strings.Builder, and skip QueryArgs when no params.
- Cache the values map when all values are literal, and share one empty
  map when none are configured.
- Reuse a single bytes.Buffer across template renders per worker.
2026-08-02 20:11:56 +04:00
aykhans f4d13d83aa fix(logging): match log levels case-sensitively 2026-07-23 00:15:21 +04:00
aykhans 80a8ba1d59 feat(logging): add runtime log levels, response logging, and progress/log-file controls
- --log-level (comma-separated string: info, error): pick which logs are emitted;
  the level set is resolved once, up front
- Log responses at the info level: full self-contained JSON to a file or stderr,
  a compact "status duration | body" summary in the TUI log box
- Route logs independently of the progress display: the TUI log box when it runs,
  stderr when piped, or a file via --log-file/-w (parent dir validated up front)
- Replace --quiet with --progress (bar | none, default bar): progress and logs are
  now independent — progress=none still shows the log box; quiet == progress=none
  with an empty log level
- Rename the internal "message" concept to "log" (runtimeLog, runtimeLogger, ...)
2026-07-22 23:20:14 +04:00
aykhans dcb0e3171f refactor: split sarin.go into runner.go and worker.go 2026-04-17 16:14:32 +04:00
aykhans 2eebac68c9 feat: add double Ctrl+C hard-kill and split TUI into tui.go
First signal cancels the main context; second releases the terminal
and exits 130, unblocking shutdown when captcha polls or user scripts
ignore context. Also moves the bubbletea models and streamProgress
out of sarin.go into a new tui.go.
2026-04-17 16:03:03 +04:00
aykhans 8577c771e4 feat: add CaptchaDecodeError type and retry transient HTTP errors during captcha polling 2026-04-12 22:03:21 +04:00
aykhans c839b71c9e refactor: rename CaptchaTimeoutError to CaptchaPollTimeoutError and separate HTTP client timeout from poll timeout 2026-04-12 21:09:24 +04:00
aykhans cea692cf1b feat: add json_Object and json_Encode template funcs 2026-04-12 04:42:52 +04:00
aykhans 1bd58a02b7 refactor: tighten captcha poll loop and document solver funcs 2026-04-12 01:10:20 +04:00
aykhans 006029aad1 feat: add captcha solving template funcs for 2Captcha, Anti-Captcha, and CapSolver 2026-04-11 21:29:57 +04:00
aykhans 44c35e6681 perf: reduce memory allocations in request generator 2026-03-22 22:26:03 +04:00
aykhans 026d05f1bf chore: bump Go to 1.26.1 and golangci-lint to v2.11.2; fix typos and lint nolints 2026-03-10 02:32:40 +04:00