illutls

package module
v0.0.0-...-833d54a Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jul 26, 2026 License: MIT Imports: 24 Imported by: 0

README

illutls

简体中文 | English


简体中文

illutls 是一个 Go 语言 HTTP 客户端,旨在模拟真实浏览器的 TLS 指纹和 HTTP 请求头。

它将 utls(用于精确实控 TLS ClientHello)和 fhttp(用于底层 HTTP/2 帧级别的通信控制)结合在一起,在每次连接时都能完美模拟出完整且真实的浏览器特征。

特性
  • TLS 指纹控制:使用 utls 精确实控 ClientHello 参数,从而完美模拟 JA3/JA4 签名。
  • HTTP/2 指纹控制:使用 fhttp 在底层控制 HTTP/2 Settings、帧顺序和伪头(Pseudo-header)顺序,精准模拟真实浏览器行为。
  • 预置配置(Profiles):内置了覆盖 Windows, macOS, Linux, Android 和 iOS 平台的真实浏览器特征(包含 Chrome, Firefox, Edge, Safari)。
  • 并发安全Client 完全支持多 Goroutine 并发安全调用。
  • TLS 扩展随机化 (Extension Shuffling):默认开启,在建立连接时随机打乱 TLS 扩展顺序,在生成动态 JA3 指纹的同时保持 JA4 哈希稳定。可通过 WithShuffleExtensions(false) 关闭。
  • 危险的 JA4 持久化随机伪造 (Dangerous JA4 Randomization):一个极度危险且必须显式开启的选项 (WithDangerousJA4Randomization())。它会通过删减密码套件来持久化随机改变 JA4 哈希。警告: 这将破坏纯正的 Chrome 官方指纹,可能会引起 Cloudflare 等高级 WAF 的异常判定,仅建议用于对抗按 JA4 频次进行拦截的自建 WAF。
  • 动态指纹 Seed (Dynamic Profile Seeds):支持将任意字符串(如代理 IP)哈希转换为确定的长效指纹,确保针对同一输入的指纹特征(包含 TLS 与 HTTP 标头)保持一致。
  • IP 物理位置语言解析 (Auto Geo-Language):内置无依赖的 MaxMind MMDB。启用后可根据代理 IP 所在的物理国家代码,运用 Chromium 算法逻辑动态生成对应的 Accept-Language 标头。
  • Fetch 标头自适应 (Auto-Adaptive Fetch Headers):针对 API/XHR 请求自动切换与更新 sec-fetch-* 标头族。
  • ECH 扩展兼容:为 ECH 扩展 (65037) 注入符合规范的 GREASE 占位数据,修复部分 WAF(如 Cloudflare)因负载为空导致的解析失败问题。
  • 代理支持:支持将请求通过 HTTP/SOCKS5 代理进行转发。
安装
go get github.com/x01n/illutls
快速开始

下面是一个模拟 Windows 端 Google Chrome 发送请求的简单示例:

package main

import (
	"fmt"
	"io"
	"log"

	"github.com/x01n/illutls"
	_ "github.com/x01n/illutls/profiles" // 导入内置的浏览器配置
)

func main() {
	// 创建一个模拟 Windows Chrome 149 的客户端
	client, err := illutls.New(illutls.WithProfile("chrome-149-windows-10"))
	if err != nil {
		log.Fatalf("创建客户端失败: %v", err)
	}
	defer client.Close()

	// 发送 GET 请求
	resp, err := client.Get("https://tls.browserleaks.com/json")
	if err != nil {
		log.Fatalf("请求失败: %v", err)
	}
	defer resp.Body.Close()

	body, err := io.ReadAll(resp.Body)
	if err != nil {
		log.Fatalf("读取响应失败: %v", err)
	}

	fmt.Println(string(body))
}
可用的浏览器配置 (内置 Profiles)

illutls 包含了多种预构建的配置。👉 点击此处查看所有支持的内置浏览器配置列表 (PROFILES.md)

你可以通过代码查看所有可用的配置名称:

profiles := illutls.ListProfiles()
for _, p := range profiles {
    fmt.Println(p)
}

默认情况下,如果你在初始化时不通过 illutls.WithProfile() 指定配置,它将默认使用 "chrome-149-windows-10"

动态指纹 Seed 与语言地域解析 (Geo-Language)

除了使用内置配置,当业务涉及大量代理 IP 轮换时,通常需要保持指纹的持久性(即同一个 IP 始终对应同一个浏览器指纹特征,包括 JA4、UA、语种等)。

illutls 支持将任意字符串(如代理 URL)哈希为确定的动态指纹,并内置了无依赖的 MaxMind MMDB,可根据代理 IP 自动解析物理国家并生成与之完美匹配的原生 Accept-Language 请求头。

👉 查阅详细的高级指纹与语言配置选项 (DOCS.md) 了解如何使用动态指纹 Seed、物理位置自适应、手工指定 ISO 国家代码或挂载外部数据库。

高级用法
使用代理

你可以使用 WithProxy 选项轻松配置代理服务器:

client, err := illutls.New(
    illutls.WithProfile("chrome-149-windows-10"),
    illutls.WithProxy("http://user:pass@proxy.example.com:8080"),
)
自定义请求与 Header

如果你需要发送 POST 请求或自定义请求头,请使用 NewRequest 并配合 client.Do() 使用:

req, err := client.NewRequest("POST", "https://example.com/api", bodyReader)
if err != nil {
    log.Fatal(err)
}

// 客户端已填充浏览器默认请求头,可在此追加或覆盖自定义请求头
req.Header.Set("Authorization", "Bearer your_token")

resp, err := client.Do(req)

English

illutls is a Go HTTP client designed to simulate real browser TLS fingerprints and HTTP headers.

It combines utls (for TLS ClientHello simulation) with fhttp (for HTTP/2 frame-level fingerprint control) to present a complete, authentic browser identity on every connection.

Features
  • TLS Fingerprinting: Precisely controls ClientHello parameters using utls to perfectly simulate JA3/JA4 signatures.
  • HTTP/2 Fingerprinting: Controls HTTP/2 settings, frame order, and pseudo-header order at the lowest level using fhttp, accurately simulating real browser behavior.
  • Pre-configured Profiles: Ships with real-world browser profiles covering Chrome, Firefox, Edge, and Safari across Windows, macOS, Linux, Android, and iOS.
  • Concurrency Safe: Client is entirely safe for concurrent use by multiple goroutines.
  • Extension Shuffling: Enabled by default to randomize the order of TLS extensions per connection. This simulates real browser extension shuffling to produce variable JA3 hashes while maintaining stable JA4 signatures. Can be disabled via WithShuffleExtensions(false).
  • Dangerous JA4 Randomization: An explicitly opt-in feature (WithDangerousJA4Randomization()) that persistently mutates the Cipher Suites list to bypass primitive, frequency-based JA4 blocklists. WARNING: This breaks the authentic Chrome fingerprint and may potentially be flagged by advanced WAFs like Cloudflare.
  • Dynamic Profile Seeds: Generate completely deterministic profiles and sticky fingerprints tied to any string (e.g. a Proxy URL).
  • Auto Geo-Language: An embedded, zero-dependency MaxMind MMDB provides instant, mathematical deduction of Chrome Accept-Language headers perfectly matched to the proxy IP's physical location.
  • Auto-Adaptive Fetch Headers: Automatically switches sec-fetch-* headers for API/XHR requests on the fly without breaking the connection pool.
  • ECH Support: Injects compliant GREASE payloads into the ECH extension (65037) to prevent TLS parsing errors on strict WAFs (e.g., Cloudflare) while preserving fingerprint integrity.
  • Proxy Support: Easily route your simulated requests through HTTP/SOCKS5 proxies.
Installation
go get github.com/x01n/illutls
Quick Start

Here's a simple example of how to make a request imitating Google Chrome on Windows:

package main

import (
	"fmt"
	"io"
	"log"

	"github.com/x01n/illutls"
	_ "github.com/x01n/illutls/profiles" // Import built-in profiles
)

func main() {
	// Create a new client mimicking Chrome 149 on Windows
	client, err := illutls.New(illutls.WithProfile("chrome-149-windows-10"))
	if err != nil {
		log.Fatalf("Failed to create client: %v", err)
	}
	defer client.Close()

	// Make a GET request
	resp, err := client.Get("https://tls.browserleaks.com/json")
	if err != nil {
		log.Fatalf("Request failed: %v", err)
	}
	defer resp.Body.Close()

	body, err := io.ReadAll(resp.Body)
	if err != nil {
		log.Fatalf("Failed to read body: %v", err)
	}

	fmt.Println(string(body))
}
Available Profiles (Built-in)

illutls includes various pre-built profiles. 👉 See the full list of supported profiles (PROFILES.md)

You can view all available profiles programmatically:

profiles := illutls.ListProfiles()
for _, p := range profiles {
    fmt.Println(p)
}

By default, if you don't specify a profile using illutls.WithProfile(), it will default to "chrome-149-windows-10".

Dynamic Profile Seeds & Geo-Language

While built-in profiles are useful, rotating proxies often requires sticky fingerprints—the same proxy IP should consistently produce the exact same browser fingerprint (JA4, UA, language) to mimic a persistent user.

illutls supports generating deterministic profiles tied to any string seed (like a proxy URL), and includes an embedded zero-dependency MaxMind MMDB for perfectly matching the Accept-Language header to the proxy's physical location.

👉 Read the Advanced Features Documentation (DOCS.md) for detailed configurations on dynamic seeds, auto geo-language resolution, ISO country overrides, and external database loading.

Advanced Usage
Using Proxies

You can easily route your traffic through a proxy server using WithProxy:

client, err := illutls.New(
    illutls.WithProfile("chrome-149-windows-10"),
    illutls.WithProxy("http://user:pass@proxy.example.com:8080"),
)
Custom Requests & Headers

If you need to send a POST request or customize headers, use NewRequest combined with client.Do():

req, err := client.NewRequest("POST", "https://example.com/api", bodyReader)
if err != nil {
    log.Fatal(err)
}

// Add your custom headers (the client already pre-populates the browser's default headers)
req.Header.Set("Authorization", "Bearer your_token")

resp, err := client.Do(req)
许可证 / License

MIT License

Documentation

Overview

package illutls provides an HTTP client that simulates real browser TLS fingerprints and HTTP headers.

Illutls combines utls (for TLS ClientHello spoofing) with fhttp (for HTTP/2 frame-level fingerprint control) to present a complete, authentic browser identity on every connection.

Quick Start

client, err := illutls.New(illutls.WithProfile("chrome-149-windows-10"))
if err != nil {
    log.Fatal(err)
}

resp, err := client.Get("https://example.com")

Available Profiles

Call ListProfiles() to see all registered browser profiles. Out of the box, Illutls ships with real-world fingerprints covering Chrome, Firefox, Edge, and Safari across Windows, macOS, Linux, Android, and iOS. If no profile is specified, it defaults to "chrome-149-windows-10".

Concurrency & Randomization

Client is safe for concurrent use by multiple goroutines. Each TLS connection gets independently randomized GREASE values and extension shuffling, making repeat connections appear as natural browser traffic.

Features

  • Extension Shuffling: Randomizes TLS extension order per connection (enabled by default).
  • ECH Support: Injects compliant GREASE payloads into the ECH extension (65037).
  • Proxy Support: Route traffic through HTTP/SOCKS5 proxies via WithProxy().

Custom Profiles

Use WithCustomProfile() to register your own BrowserProfile with a custom TLS spec, HTTP/2 settings, and header ordering.

Index

Constants

This section is empty.

Variables

View Source
var (
	// ErrProfileNotFound is returned when a requested browser profile does not exist.
	ErrProfileNotFound = errors.New("illutls: browser profile not found")
	// ErrTLSHandshake is returned when the TLS connection fails.
	ErrTLSHandshake = errors.New("illutls: TLS handshake failed")
	// ErrH2Settings is returned when HTTP/2 settings cannot be applied.
	ErrH2Settings = errors.New("illutls: HTTP/2 settings application failed")
	// ErrInvalidProxy is returned when the provided proxy URL is invalid.
	ErrInvalidProxy = errors.New("illutls: invalid proxy URL")
	// ErrNilProfile is returned if a nil profile is provided to the transport.
	ErrNilProfile = errors.New("illutls: profile must not be nil")
	// ErrConnectionFailed is returned for general dial or connection errors.
	ErrConnectionFailed = errors.New("illutls: connection failed")
)
View Source
var ErrHTTP11Negotiated = errors.New("http/1.1 negotiated")

Functions

func ApplyH2Settings

func ApplyH2Settings(t *http2.Transport, s H2Settings, windowUpdate uint32, priority H2Priority, priorities []H2StreamPriority)

ApplyH2Settings configures an fhttp http2.Transport to match the browser profile's HTTP/2 SETTINGS frame parameters.

func BuildHeaders

func BuildHeaders(profile *BrowserProfile, req *http.Request) http.Header

BuildHeaders constructs the full HTTP header set for a request according to the profile's template and ordering rules.

Dynamic headers (:authority, :path, host, etc.) are filled from the request itself; static headers (user-agent, sec-ch-ua, accept-encoding, etc.) come from the profile definition.

func BuildRawLanguageList

func BuildRawLanguageList(lang, country string) string

BuildRawLanguageList perfectly mimics Chrome's OS locale fallback algorithm. When an OS is set to a specific locale (e.g., "ja-JP"), Chrome builds the Accept-Language by taking the specific locale, then the base language, and appending English fallbacks.

func CloneClientHelloSpec

func CloneClientHelloSpec(src *utls.ClientHelloSpec) *utls.ClientHelloSpec

CloneClientHelloSpec deep-copies a ClientHelloSpec so that GREASE randomization on one connection does not affect others.

func GenerateAcceptLanguageHeader

func GenerateAcceptLanguageHeader(rawLanguageList string) string

GenerateAcceptLanguageHeader perfectly mimics Chromium's net::HttpUtil::GenerateAcceptLanguageHeader It takes a comma-separated list of languages (e.g. "ja,en-US,en") and applies descending q-values.

func InjectECHPublicKey

func InjectECHPublicKey(spec *utls.ClientHelloSpec) error

func ListProfiles

func ListProfiles() []string

ListProfiles returns the names of all registered profiles.

func MergeHeaders

func MergeHeaders(dst, src http.Header)

MergeHeaders copies src headers into dst without overwriting existing keys.

func RandomizeGREASE

func RandomizeGREASE(spec *utls.ClientHelloSpec)

func RegisterProfile

func RegisterProfile(p *BrowserProfile)

RegisterProfile adds a browser profile to the global registry. If a profile with the same name already exists it is overwritten.

func ShuffleExtensions

func ShuffleExtensions(spec *utls.ClientHelloSpec)

Types

type BrowserProfile

type BrowserProfile struct {
	// Name is a human-readable identifier, e.g. "Chrome 141 Windows".
	Name string
	// UserAgent is the User-Agent header string.
	UserAgent string
	// TLSSpec defines the TLS ClientHello parameters for utls.
	// GREASE placeholders are randomized at connection time.
	TLSSpec *utls.ClientHelloSpec
	// H2Settings configures the HTTP/2 SETTINGS frame.
	H2Settings H2Settings
	// H2WindowUpdate is the WINDOW_UPDATE increment sent after SETTINGS.
	H2WindowUpdate uint32
	// H2Priority configures the PRIORITY field in HEADERS frames.
	H2Priority H2Priority
	// H2Priorities lists standalone PRIORITY frames emitted right after the SETTINGS
	// frame — Firefox's placeholder dependency tree (streams 3/5/7/9/11/13). Leave
	// empty for browsers that don't send them (e.g. Chrome). Mapped onto the fhttp
	// http2.Transport.Priorities field.
	H2Priorities []H2StreamPriority
	// HeaderOrder defines the order of standard HTTP headers (lowercase).
	HeaderOrder []string
	// PHeaderOrder defines the order of HTTP/2 pseudo-headers.
	PHeaderOrder []string
	// Headers supplies default header values (sec-ch-ua, accept, etc.).
	// Keys are canonical HTTP header names.
	Headers map[string]string
}

BrowserProfile defines the complete fingerprint for a browser identity. It is immutable after creation 鈥?safe to share across goroutines.

func GenerateProfile

func GenerateProfile(seed int64, platform string, majorVersion int, forceRandomizeJA4 bool) *BrowserProfile

GenerateProfile creates a deterministic BrowserProfile based on a seed. platform can be "windows", "mac", "linux", "android", "ios".

func GetProfile

func GetProfile(name string) *BrowserProfile

GetProfile returns a registered profile by name, or nil if not found.

type Client

type Client struct {
	// contains filtered or unexported fields
}

Client is the main entry point for Illutls. It provides browser-identical HTTP requests with automatic TLS and header fingerprinting.

Client is safe for concurrent use by multiple goroutines.

func New

func New(opts ...Option) (*Client, error)

New creates an Illutls Client configured with the given options.

Example:

client, err := illutls.New(illutls.WithProfile("Chrome 141 Windows"))
if err != nil {
    log.Fatal(err)
}
defer client.Close()

resp, err := client.Get("https://example.com")

func (*Client) Close

func (c *Client) Close()

Close releases resources held by the Client.

func (*Client) Do

func (c *Client) Do(req *http.Request) (*http.Response, error)

Do sends an HTTP request and returns an HTTP response. The caller is responsible for closing the response body.

func (*Client) Get

func (c *Client) Get(url string) (*http.Response, error)

Get issues a GET request to the specified URL.

func (*Client) Head

func (c *Client) Head(url string) (*http.Response, error)

Head issues a HEAD request to the specified URL.

func (*Client) NewRequest

func (c *Client) NewRequest(method, url string, body io.Reader) (*http.Request, error)

NewRequest creates a new HTTP request with the profile's headers pre-populated. The caller can override any header before calling Do().

func (*Client) Post

func (c *Client) Post(url, contentType string, body io.Reader) (*http.Response, error)

Post issues a POST request to the specified URL.

func (*Client) Profile

func (c *Client) Profile() *BrowserProfile

Profile returns the active BrowserProfile.

type H2Priority

type H2Priority struct {
	Weight    uint8
	DependsOn uint32
	Exclusive bool
}

H2Priority corresponds to the PRIORITY field in an HTTP/2 HEADERS frame.

type H2Settings

type H2Settings struct {
	HeaderTableSize      uint32
	EnablePush           uint32
	MaxConcurrentStreams uint32
	InitialWindowSize    uint32
	MaxFrameSize         uint32
	MaxHeaderListSize    uint32
	// NoRFC7540Priorities corresponds to SETTINGS_NO_RFC7540_PRIORITIES (0x09).
	NoRFC7540Priorities uint32

	// SettingsOrder explicitly defines the order of settings. If empty, a default order is used.
	SettingsOrder []uint16
}

H2Settings corresponds to an HTTP/2 SETTINGS frame.

type H2StreamPriority

type H2StreamPriority struct {
	StreamID  uint32
	DependsOn uint32
	Weight    uint8
	Exclusive bool
}

H2StreamPriority is a standalone HTTP/2 PRIORITY frame in the profile's dependency-tree fingerprint. Firefox emits a fixed set right after SETTINGS (streams 3/5/7/9/11/13) to build its placeholder priority tree; real requests then depend on those placeholders.

type Option

type Option func(*Options)

Option is a functional option for configuring a Client.

func WithCustomProfile

func WithCustomProfile(p *BrowserProfile) Option

WithCustomProfile provides a user-defined BrowserProfile directly.

func WithDangerousJA4Randomization

func WithDangerousJA4Randomization() Option

WithDangerousJA4Randomization enables persistent randomization of the JA4 hash by deterministically mutating the cipher suites based on the profile seed. WARNING: This is a highly dangerous feature. Modifying the cipher suite list breaks the authentic Chrome fingerprint. Advanced WAFs (Cloudflare, Akamai) may flag this as an anomaly. Use ONLY against primitive self-built WAFs that blindly block JA4 hashes based on frequency.

func WithDisableKeepAlives

func WithDisableKeepAlives() Option

WithDisableKeepAlives disables HTTP keep-alive.

func WithDynamicProfile

func WithDynamicProfile(seed any, params ...any) Option

func WithLanguage

func WithLanguage(lang string) Option

WithLanguage handles Accept-Language generation with extreme flexibility: 1. "auto": Automatically infers language from Proxy IP using the embedded GeoIP MMDB. 2. "/path/to/geo.mmdb": Automatically infers language using the provided external MMDB. 3. "FR": Uses a 2-letter ISO country code to dynamically generate Chrome locale strings. 4. "ja,en-US,en": Uses the explicit raw language string. All generated strings are passed through Chrome's exact mathematical q-value algorithm.

func WithMaxRedirects

func WithMaxRedirects(n int) Option

WithMaxRedirects sets the maximum number of redirect hops.

func WithPrebuiltHeaders

func WithPrebuiltHeaders() Option

WithPrebuiltHeaders caches the profile's static header set once and reuses it per request instead of rebuilding it each RoundTrip. Enable for high-throughput callers that set all dynamic/context headers (sec-fetch-*, cookie, referer) themselves.

func WithProfile

func WithProfile(name string) Option

WithProfile selects a registered browser profile by name.

func WithProxy

func WithProxy(proxyURL string) Option

WithProxy sets an HTTP or SOCKS5 proxy URL.

func WithReuseRequest

func WithReuseRequest() Option

WithReuseRequest skips the per-request defensive Clone inside RoundTrip to reduce allocations. Only enable when each *http.Request is freshly built and never reused or read concurrently by the caller after Do returns (e.g. load generators).

func WithShuffleExtensions

func WithShuffleExtensions(b bool) Option

WithShuffleExtensions dynamically randomizes the order of TLS extensions per connection to mimic Chrome's Extension Shuffling behavior and avoid TLS parroting.

func WithTLSConfig

func WithTLSConfig(c *tls.Config) Option

WithTLSConfig provides additional TLS configuration.

func WithTLSHandshakeTimeout

func WithTLSHandshakeTimeout(d time.Duration) Option

WithTLSHandshakeTimeout sets the TLS handshake timeout.

func WithTimeout

func WithTimeout(d time.Duration) Option

WithTimeout sets the total request timeout.

func WithoutRedirects

func WithoutRedirects() Option

WithoutRedirects disables following HTTP redirects.

type Options

type Options struct {
	// ProfileName selects a registered BrowserProfile by name.
	ProfileName string
	// Profile is a user-supplied profile (takes precedence over ProfileName).
	Profile *BrowserProfile
	// Timeout is the total request timeout (default: 30s).
	Timeout time.Duration
	// TLSHandshakeTimeout limits the TLS handshake duration (default: 10s).
	TLSHandshakeTimeout time.Duration
	// ProxyURL is an optional HTTP/SOCKS5 proxy (e.g. "socks5://127.0.0.1:1080").
	ProxyURL string
	// TLSConfig provides additional tls.Config fields (e.g. InsecureSkipVerify).
	// ServerName is automatically set per-request and should not be set here.
	TLSConfig *tls.Config
	// FollowRedirects controls whether the client follows HTTP redirects (default: true).
	FollowRedirects bool
	// MaxRedirects limits redirect hops (default: 10).
	MaxRedirects int
	// DisableKeepAlives disables HTTP keep-alive connections.
	DisableKeepAlives bool
	// ShuffleExtensions dynamically randomizes the order of TLS extensions per connection.
	ShuffleExtensions bool
	// GeoIPDBPath is the local path to the GeoLite2-Country.mmdb file.
	GeoIPDBPath string
	// RawLanguageList is the explicit raw language string to be parsed via Chrome's algorithm.
	RawLanguageList string
	// ForceRandomizeJA4 is a highly dangerous feature that persistently modifies the cipher suite
	// list to generate a randomized JA4 hash, useful only against primitive blocklists.
	ForceRandomizeJA4 bool
	// Dynamic profile generation parameters (evaluated in New)
	DynamicProfileSeed     *int64
	DynamicProfilePlatform string
	DynamicProfileVersion  int
	// ReuseRequest skips the defensive req.Clone in RoundTrip to cut per-request
	// allocations. Safe ONLY when the caller builds a fresh *http.Request per call and
	// never reuses it or reads it concurrently after Do returns (e.g. high-throughput
	// load generators). Default false keeps the clone for general-purpose correctness.
	ReuseRequest bool
	// PrebuildHeaders caches the profile's static header template once at Transport
	// construction and reuses it per request, skipping the per-request BuildHeaders
	// allocation + string scanning. Header ordering still follows the profile (merge
	// semantics unchanged, so the fingerprint is identical). Safe ONLY when the caller
	// supplies all dynamic/context headers (sec-fetch-*, cookie, referer) itself, since
	// the cached template omits BuildHeaders' per-request API-request heuristics.
	PrebuildHeaders bool
}

Options holds all configuration for a Client.

type Transport

type Transport struct {
	// contains filtered or unexported fields
}

func NewTransport

func NewTransport(profile *BrowserProfile, opts *Options) (*Transport, error)

NewTransport creates a Transport for the given profile.

func (*Transport) Close

func (t *Transport) Close()

Close shuts down idle connections.

func (*Transport) RoundTrip

func (t *Transport) RoundTrip(req *http.Request) (*http.Response, error)

Directories

Path Synopsis

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL