Documentation
¶
Index ¶
- func Forward(ctx context.Context, client, upstream net.Conn, peeked []byte, ...)
- func PeekClientHello(conn net.Conn) (peeked []byte, serverName string, err error)
- func RemoveStats(path string)
- func StatsPath() string
- func WriteStats(path string, s Stats) error
- type Config
- type Decider
- type InteractiveDecider
- type Mode
- type Policy
- type PromptFunc
- type Server
- type Stats
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func Forward ¶
Forward pipes data bidirectionally between client and upstream, replaying peeked ClientHello bytes to upstream first.
func PeekClientHello ¶
PeekClientHello reads the TLS ClientHello from conn without consuming it. Returns the peeked bytes (to replay to upstream) and the extracted SNI hostname.
func RemoveStats ¶ added in v0.14.0
func RemoveStats(path string)
RemoveStats removes the proxy stats file (best-effort).
func StatsPath ¶ added in v0.14.0
func StatsPath() string
StatsPath returns the default path for the proxy stats file (~/.human/proxy-stats.json).
func WriteStats ¶ added in v0.14.0
WriteStats atomically writes stats to path (write tmp + rename).
Types ¶
type Config ¶
Config holds the proxy section of .humanconfig.yaml.
func LoadConfig ¶
LoadConfig reads the proxy configuration from .humanconfig.yaml in dir. Returns (nil, nil) when the proxy section is absent.
type InteractiveDecider ¶
type InteractiveDecider struct {
// contains filtered or unexported fields
}
InteractiveDecider wraps a base Decider and prompts the user for hostnames that the base does not allow. Decisions are cached for the session.
func NewInteractiveDecider ¶
func NewInteractiveDecider(base Decider, prompt PromptFunc) *InteractiveDecider
NewInteractiveDecider creates an InteractiveDecider that falls through to prompt for hostnames not allowed by base.
func (*InteractiveDecider) Allowed ¶
func (d *InteractiveDecider) Allowed(hostname string) bool
Allowed returns true if the hostname is permitted. Hostnames allowed by the base decider pass through immediately. Unknown hostnames trigger a prompt; the result is cached for subsequent calls.
type Policy ¶
type Policy struct {
// contains filtered or unexported fields
}
Policy decides whether a given hostname is allowed to pass through the proxy.
func BlockAllPolicy ¶
func BlockAllPolicy() *Policy
BlockAllPolicy returns a policy that blocks every hostname.
type PromptFunc ¶
PromptFunc asks the user whether a hostname should be allowed. It returns true to allow, false to deny.
func NewTerminalPrompt ¶
func NewTerminalPrompt(in io.Reader, out io.Writer) PromptFunc
NewTerminalPrompt returns a PromptFunc that asks the user via the terminal. It serialises I/O with its own mutex so that concurrent prompts don't interleave on the terminal.
type Server ¶
type Server struct {
Addr string
Policy Decider
Logger zerolog.Logger
// Dialer connects to upstream servers. Injected for testing.
Dialer func(ctx context.Context, network, address string) (net.Conn, error)
// contains filtered or unexported fields
}
Server is a transparent HTTPS proxy that reads the SNI from TLS ClientHello to block/allow domains without decrypting traffic.
func (*Server) ActiveConns ¶ added in v0.14.0
ActiveConns returns the number of currently active forwarded connections.