mirror of
https://github.com/yusing/godoxy.git
synced 2025-05-20 12:42:34 +02:00
http: increase default response header timeout to 60s, add option to customize it, schema update
This commit is contained in:
parent
d9b6b82f07
commit
dfc634a362
18 changed files with 96 additions and 28 deletions
|
@ -76,9 +76,7 @@ func (err *nestedError) Error() string {
|
||||||
if err.Err != nil {
|
if err.Err != nil {
|
||||||
lines = append(lines, makeLine(err.Err.Error(), 0))
|
lines = append(lines, makeLine(err.Err.Error(), 0))
|
||||||
}
|
}
|
||||||
if extras := makeLines(err.Extras, 1); len(extras) > 0 {
|
lines = append(lines, makeLines(err.Extras, 1)...)
|
||||||
lines = append(lines, extras...)
|
|
||||||
}
|
|
||||||
return strutils.JoinLines(lines)
|
return strutils.JoinLines(lines)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -104,9 +102,7 @@ func makeLines(errs []error, level int) []string {
|
||||||
if err.Err != nil {
|
if err.Err != nil {
|
||||||
lines = append(lines, makeLine(err.Err.Error(), level))
|
lines = append(lines, makeLine(err.Err.Error(), level))
|
||||||
}
|
}
|
||||||
if extras := makeLines(err.Extras, level+1); len(extras) > 0 {
|
lines = append(lines, makeLines(err.Extras, level+1)...)
|
||||||
lines = append(lines, extras...)
|
|
||||||
}
|
|
||||||
default:
|
default:
|
||||||
lines = append(lines, makeLine(err.Error(), level))
|
lines = append(lines, makeLine(err.Error(), level))
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,7 +20,7 @@ var (
|
||||||
TLSHandshakeTimeout: 10 * time.Second,
|
TLSHandshakeTimeout: 10 * time.Second,
|
||||||
ExpectContinueTimeout: 1 * time.Second,
|
ExpectContinueTimeout: 1 * time.Second,
|
||||||
DisableCompression: true, // Prevent double compression
|
DisableCompression: true, // Prevent double compression
|
||||||
ResponseHeaderTimeout: 30 * time.Second,
|
ResponseHeaderTimeout: 60 * time.Second,
|
||||||
WriteBufferSize: 16 * 1024, // 16KB
|
WriteBufferSize: 16 * 1024, // 16KB
|
||||||
ReadBufferSize: 16 * 1024, // 16KB
|
ReadBufferSize: 16 * 1024, // 16KB
|
||||||
}
|
}
|
||||||
|
|
|
@ -44,11 +44,15 @@ type (
|
||||||
// var globalMux = http.NewServeMux() // TODO: support regex subdomain matching.
|
// var globalMux = http.NewServeMux() // TODO: support regex subdomain matching.
|
||||||
|
|
||||||
func NewHTTPRoute(entry *entry.ReverseProxyEntry) (impl, E.Error) {
|
func NewHTTPRoute(entry *entry.ReverseProxyEntry) (impl, E.Error) {
|
||||||
var trans *http.Transport
|
trans := gphttp.DefaultTransport
|
||||||
if entry.Raw.NoTLSVerify {
|
httpConfig := entry.Raw.HTTPConfig
|
||||||
|
|
||||||
|
if httpConfig.NoTLSVerify {
|
||||||
trans = gphttp.DefaultTransportNoTLS
|
trans = gphttp.DefaultTransportNoTLS
|
||||||
} else {
|
}
|
||||||
trans = gphttp.DefaultTransport
|
if httpConfig.ResponseHeaderTimeout > 0 {
|
||||||
|
trans = trans.Clone()
|
||||||
|
trans.ResponseHeaderTimeout = httpConfig.ResponseHeaderTimeout
|
||||||
}
|
}
|
||||||
|
|
||||||
service := entry.TargetName()
|
service := entry.TargetName()
|
||||||
|
|
10
internal/route/types/http_config.go
Normal file
10
internal/route/types/http_config.go
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
package types
|
||||||
|
|
||||||
|
import (
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
type HTTPConfig struct {
|
||||||
|
NoTLSVerify bool `json:"no_tls_verify,omitempty"`
|
||||||
|
ResponseHeaderTimeout time.Duration `json:"response_header_timeout,omitempty"`
|
||||||
|
}
|
47
internal/route/types/http_config_test.go
Normal file
47
internal/route/types/http_config_test.go
Normal file
|
@ -0,0 +1,47 @@
|
||||||
|
package types
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/yusing/go-proxy/internal/utils"
|
||||||
|
. "github.com/yusing/go-proxy/internal/utils/testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestHTTPConfigDeserialize(t *testing.T) {
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
input map[string]any
|
||||||
|
expected HTTPConfig
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "no_tls_verify",
|
||||||
|
input: map[string]any{
|
||||||
|
"no_tls_verify": "true",
|
||||||
|
},
|
||||||
|
expected: HTTPConfig{
|
||||||
|
NoTLSVerify: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "response_header_timeout",
|
||||||
|
input: map[string]any{
|
||||||
|
"response_header_timeout": "1s",
|
||||||
|
},
|
||||||
|
expected: HTTPConfig{
|
||||||
|
ResponseHeaderTimeout: 1 * time.Second,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, tt := range tests {
|
||||||
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
|
cfg := RawEntry{}
|
||||||
|
err := utils.Deserialize(tt.input, &cfg)
|
||||||
|
if err != nil {
|
||||||
|
ExpectNoError(t, err)
|
||||||
|
}
|
||||||
|
ExpectDeepEqual(t, cfg.HTTPConfig, &tt.expected)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
|
@ -25,11 +25,12 @@ type (
|
||||||
|
|
||||||
// raw entry object before validation
|
// raw entry object before validation
|
||||||
// loaded from docker labels or yaml file
|
// loaded from docker labels or yaml file
|
||||||
Alias string `json:"alias"`
|
Alias string `json:"alias"`
|
||||||
Scheme string `json:"scheme,omitempty"`
|
Scheme string `json:"scheme,omitempty"`
|
||||||
Host string `json:"host,omitempty"`
|
Host string `json:"host,omitempty"`
|
||||||
Port string `json:"port,omitempty"`
|
Port string `json:"port,omitempty"`
|
||||||
NoTLSVerify bool `json:"no_tls_verify,omitempty"`
|
|
||||||
|
HTTPConfig
|
||||||
PathPatterns []string `json:"path_patterns,omitempty"`
|
PathPatterns []string `json:"path_patterns,omitempty"`
|
||||||
Rules rules.Rules `json:"rules,omitempty" validate:"omitempty,unique=Name"`
|
Rules rules.Rules `json:"rules,omitempty" validate:"omitempty,unique=Name"`
|
||||||
HealthCheck *health.HealthCheckConfig `json:"healthcheck,omitempty"`
|
HealthCheck *health.HealthCheckConfig `json:"healthcheck,omitempty"`
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "godoxy-schemas",
|
"name": "godoxy-schemas",
|
||||||
"version": "0.9.0-20",
|
"version": "0.9.0-22",
|
||||||
"description": "JSON Schema and typescript types for GoDoxy configuration",
|
"description": "JSON Schema and typescript types for GoDoxy configuration",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"repository": {
|
"repository": {
|
||||||
|
|
File diff suppressed because one or more lines are too long
2
schemas/config/notification.d.ts
vendored
2
schemas/config/notification.d.ts
vendored
|
@ -9,7 +9,7 @@ export interface GotifyConfig extends NotificationConfig {
|
||||||
provider: "gotify";
|
provider: "gotify";
|
||||||
token: string;
|
token: string;
|
||||||
}
|
}
|
||||||
export declare const WEBHOOK_TEMPLATES: readonly ["discord"];
|
export declare const WEBHOOK_TEMPLATES: readonly ["", "discord"];
|
||||||
export declare const WEBHOOK_METHODS: readonly ["POST", "GET", "PUT"];
|
export declare const WEBHOOK_METHODS: readonly ["POST", "GET", "PUT"];
|
||||||
export declare const WEBHOOK_MIME_TYPES: readonly ["application/json", "application/x-www-form-urlencoded", "text/plain"];
|
export declare const WEBHOOK_MIME_TYPES: readonly ["application/json", "application/x-www-form-urlencoded", "text/plain"];
|
||||||
export declare const WEBHOOK_COLOR_MODES: readonly ["hex", "dec"];
|
export declare const WEBHOOK_COLOR_MODES: readonly ["hex", "dec"];
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
export const NOTIFICATION_PROVIDERS = ["webhook", "gotify"];
|
export const NOTIFICATION_PROVIDERS = ["webhook", "gotify"];
|
||||||
export const WEBHOOK_TEMPLATES = ["discord"];
|
export const WEBHOOK_TEMPLATES = ["", "discord"];
|
||||||
export const WEBHOOK_METHODS = ["POST", "GET", "PUT"];
|
export const WEBHOOK_METHODS = ["POST", "GET", "PUT"];
|
||||||
export const WEBHOOK_MIME_TYPES = [
|
export const WEBHOOK_MIME_TYPES = [
|
||||||
"application/json",
|
"application/json",
|
||||||
|
|
|
@ -17,7 +17,7 @@ export interface GotifyConfig extends NotificationConfig {
|
||||||
token: string;
|
token: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
export const WEBHOOK_TEMPLATES = ["discord"] as const;
|
export const WEBHOOK_TEMPLATES = ["", "discord"] as const;
|
||||||
export const WEBHOOK_METHODS = ["POST", "GET", "PUT"] as const;
|
export const WEBHOOK_METHODS = ["POST", "GET", "PUT"] as const;
|
||||||
export const WEBHOOK_MIME_TYPES = [
|
export const WEBHOOK_MIME_TYPES = [
|
||||||
"application/json",
|
"application/json",
|
||||||
|
|
File diff suppressed because one or more lines are too long
|
@ -1 +1 @@
|
||||||
{"$schema":"http://json-schema.org/draft-07/schema#","definitions":{"CIDR":{"anyOf":[{"pattern":"^[0-9]*\\.[0-9]*\\.[0-9]*\\.[0-9]*$","type":"string"},{"pattern":"^.*:.*:.*:.*:.*:.*:.*:.*$","type":"string"},{"pattern":"^[0-9]*\\.[0-9]*\\.[0-9]*\\.[0-9]*/[0-9]*$","type":"string"},{"pattern":"^::[0-9]*$","type":"string"},{"pattern":"^.*::/[0-9]*$","type":"string"},{"pattern":"^.*:.*::/[0-9]*$","type":"string"}]},"Duration":{"pattern":"^([0-9]+(ms|s|m|h))+$","type":"string"},"HTTPHeader":{"description":"HTTP Header","pattern":"^[a-zA-Z0-9\\-]+$","type":"string"},"MiddlewareComposeMap":{"anyOf":[{"additionalProperties":false,"properties":{"use":{"enum":["CustomErrorPage","ErrorPage","customErrorPage","custom_error_page","errorPage","error_page"],"type":"string"}},"required":["use"],"type":"object"},{"additionalProperties":false,"properties":{"use":{"enum":["RedirectHTTP","redirectHTTP","redirect_http"],"type":"string"}},"required":["use"],"type":"object"},{"additionalProperties":false,"properties":{"use":{"enum":["SetXForwarded","setXForwarded","set_x_forwarded"],"type":"string"}},"required":["use"],"type":"object"},{"additionalProperties":false,"properties":{"use":{"enum":["HideXForwarded","hideXForwarded","hide_x_forwarded"],"type":"string"}},"required":["use"],"type":"object"},{"additionalProperties":false,"properties":{"allow":{"items":{"$ref":"#/definitions/CIDR"},"type":"array"},"message":{"default":"IP not allowed","description":"Error message when blocked","type":"string"},"status":{"$ref":"#/definitions/StatusCode","default":403,"description":"HTTP status code when blocked (alias of status_code)"},"status_code":{"$ref":"#/definitions/StatusCode","default":403,"description":"HTTP status code when blocked"},"use":{"enum":["CIDRWhitelist","cidrWhitelist","cidr_whitelist"],"type":"string"}},"required":["allow","use"],"type":"object"},{"additionalProperties":false,"properties":{"recursive":{"default":false,"description":"Recursively resolve the IP","type":"boolean"},"use":{"enum":["cloudflareRealIp","cloudflare_real_ip"],"type":"string"}},"required":["use"],"type":"object"},{"additionalProperties":false,"properties":{"add_headers":{"additionalProperties":false,"description":"Add HTTP headers","items":{"type":"string"},"type":"array"},"hide_headers":{"description":"Hide HTTP headers","items":{"$ref":"#/definitions/HTTPHeader"},"type":"array"},"set_headers":{"additionalProperties":false,"description":"Set HTTP headers","items":{"type":"string"},"type":"array"},"use":{"enum":["ModifyRequest","Request","modifyRequest","modify_request","request"],"type":"string"}},"required":["use"],"type":"object"},{"additionalProperties":false,"properties":{"add_headers":{"additionalProperties":false,"description":"Add HTTP headers","items":{"type":"string"},"type":"array"},"hide_headers":{"description":"Hide HTTP headers","items":{"$ref":"#/definitions/HTTPHeader"},"type":"array"},"set_headers":{"additionalProperties":false,"description":"Set HTTP headers","items":{"type":"string"},"type":"array"},"use":{"enum":["ModifyResponse","Response","modifyResponse","modify_response","response"],"type":"string"}},"required":["use"],"type":"object"},{"additionalProperties":false,"properties":{"allowed_groups":{"description":"Allowed groups","items":{"type":"string"},"minItems":1,"type":"array"},"allowed_users":{"description":"Allowed users","items":{"type":"string"},"minItems":1,"type":"array"},"use":{"enum":["OIDC","oidc"],"type":"string"}},"required":["use"],"type":"object"},{"additionalProperties":false,"properties":{"average":{"description":"Average number of requests allowed in a period","type":"number"},"burst":{"description":"Maximum number of requests allowed in a period","type":"number"},"period":{"$ref":"#/definitions/Duration","default":"1s","description":"Duration of the rate limit"},"use":{"enum":["RateLimit","rateLimit","rate_limit"],"type":"string"}},"required":["average","burst","use"],"type":"object"},{"additionalProperties":false,"properties":{"from":{"items":{"$ref":"#/definitions/CIDR"},"type":"array"},"header":{"$ref":"#/definitions/HTTPHeader","default":"X-Real-IP","description":"Header to get the client IP from"},"recursive":{"default":false,"description":"Recursive resolve the IP","type":"boolean"},"use":{"enum":["RealIP","realIP","real_ip"],"type":"string"}},"required":["from","use"],"type":"object"}]},"StatusCode":{"anyOf":[{"pattern":"^[0-9]*$","type":"string"},{"type":"number"}]}},"items":{"$ref":"#/definitions/MiddlewareComposeMap"},"type":"array"}
|
{"$schema":"http://json-schema.org/draft-07/schema#","definitions":{"CIDR":{"anyOf":[{"pattern":"^[0-9]*\\.[0-9]*\\.[0-9]*\\.[0-9]*$","type":"string"},{"pattern":"^.*:.*:.*:.*:.*:.*:.*:.*$","type":"string"},{"pattern":"^[0-9]*\\.[0-9]*\\.[0-9]*\\.[0-9]*/[0-9]*$","type":"string"},{"pattern":"^::[0-9]*$","type":"string"},{"pattern":"^.*::/[0-9]*$","type":"string"},{"pattern":"^.*:.*::/[0-9]*$","type":"string"}]},"Duration":{"pattern":"^([0-9]+(ms|s|m|h))+$","type":"string"},"HTTPHeader":{"description":"HTTP Header","pattern":"^[a-zA-Z0-9\\-]+$","type":"string"},"MiddlewareComposeMap":{"anyOf":[{"additionalProperties":false,"properties":{"use":{"enum":["CustomErrorPage","ErrorPage","customErrorPage","custom_error_page","errorPage","error_page"],"type":"string"}},"required":["use"],"type":"object"},{"additionalProperties":false,"properties":{"use":{"enum":["RedirectHTTP","redirectHTTP","redirect_http"],"type":"string"}},"required":["use"],"type":"object"},{"additionalProperties":false,"properties":{"use":{"enum":["SetXForwarded","setXForwarded","set_x_forwarded"],"type":"string"}},"required":["use"],"type":"object"},{"additionalProperties":false,"properties":{"use":{"enum":["HideXForwarded","hideXForwarded","hide_x_forwarded"],"type":"string"}},"required":["use"],"type":"object"},{"additionalProperties":false,"properties":{"allow":{"items":{"$ref":"#/definitions/CIDR"},"type":"array"},"message":{"default":"IP not allowed","description":"Error message when blocked","type":"string"},"status":{"$ref":"#/definitions/StatusCode","default":403,"description":"HTTP status code when blocked (alias of status_code)"},"status_code":{"$ref":"#/definitions/StatusCode","default":403,"description":"HTTP status code when blocked"},"use":{"enum":["CIDRWhitelist","cidrWhitelist","cidr_whitelist"],"type":"string"}},"required":["allow","use"],"type":"object"},{"additionalProperties":false,"properties":{"recursive":{"default":false,"description":"Recursively resolve the IP","type":"boolean"},"use":{"enum":["CloudflareRealIP","cloudflareRealIp","cloudflare_real_ip"],"type":"string"}},"required":["use"],"type":"object"},{"additionalProperties":false,"properties":{"add_headers":{"additionalProperties":false,"description":"Add HTTP headers","items":{"type":"string"},"type":"array"},"hide_headers":{"description":"Hide HTTP headers","items":{"$ref":"#/definitions/HTTPHeader"},"type":"array"},"set_headers":{"additionalProperties":false,"description":"Set HTTP headers","items":{"type":"string"},"type":"array"},"use":{"enum":["ModifyRequest","Request","modifyRequest","modify_request","request"],"type":"string"}},"required":["use"],"type":"object"},{"additionalProperties":false,"properties":{"add_headers":{"additionalProperties":false,"description":"Add HTTP headers","items":{"type":"string"},"type":"array"},"hide_headers":{"description":"Hide HTTP headers","items":{"$ref":"#/definitions/HTTPHeader"},"type":"array"},"set_headers":{"additionalProperties":false,"description":"Set HTTP headers","items":{"type":"string"},"type":"array"},"use":{"enum":["ModifyResponse","Response","modifyResponse","modify_response","response"],"type":"string"}},"required":["use"],"type":"object"},{"additionalProperties":false,"properties":{"allowed_groups":{"description":"Allowed groups","items":{"type":"string"},"minItems":1,"type":"array"},"allowed_users":{"description":"Allowed users","items":{"type":"string"},"minItems":1,"type":"array"},"use":{"enum":["OIDC","oidc"],"type":"string"}},"required":["use"],"type":"object"},{"additionalProperties":false,"properties":{"average":{"description":"Average number of requests allowed in a period","type":"number"},"burst":{"description":"Maximum number of requests allowed in a period","type":"number"},"period":{"$ref":"#/definitions/Duration","default":"1s","description":"Duration of the rate limit"},"use":{"enum":["RateLimit","rateLimit","rate_limit"],"type":"string"}},"required":["average","burst","use"],"type":"object"},{"additionalProperties":false,"properties":{"from":{"items":{"$ref":"#/definitions/CIDR"},"type":"array"},"header":{"$ref":"#/definitions/HTTPHeader","default":"X-Real-IP","description":"Header to get the client IP from"},"recursive":{"default":false,"description":"Recursive resolve the IP","type":"boolean"},"use":{"enum":["RealIP","realIP","real_ip"],"type":"string"}},"required":["from","use"],"type":"object"}]},"StatusCode":{"anyOf":[{"pattern":"^[0-9]*$","type":"string"},{"type":"number"}]}},"items":{"$ref":"#/definitions/MiddlewareComposeMap"},"type":"array"}
|
2
schemas/middlewares/middlewares.d.ts
vendored
2
schemas/middlewares/middlewares.d.ts
vendored
|
@ -46,7 +46,7 @@ export type CIDRWhitelist = {
|
||||||
message?: string;
|
message?: string;
|
||||||
};
|
};
|
||||||
export type CloudflareRealIP = {
|
export type CloudflareRealIP = {
|
||||||
use: "cloudflare_real_ip" | "cloudflareRealIp" | "cloudflare_real_ip";
|
use: "cloudflare_real_ip" | "cloudflareRealIp" | "CloudflareRealIP";
|
||||||
/** Recursively resolve the IP
|
/** Recursively resolve the IP
|
||||||
*
|
*
|
||||||
* @default false
|
* @default false
|
||||||
|
|
|
@ -96,7 +96,7 @@ export type CIDRWhitelist = {
|
||||||
};
|
};
|
||||||
|
|
||||||
export type CloudflareRealIP = {
|
export type CloudflareRealIP = {
|
||||||
use: "cloudflare_real_ip" | "cloudflareRealIp" | "cloudflare_real_ip";
|
use: "cloudflare_real_ip" | "cloudflareRealIp" | "CloudflareRealIP";
|
||||||
/** Recursively resolve the IP
|
/** Recursively resolve the IP
|
||||||
*
|
*
|
||||||
* @default false
|
* @default false
|
||||||
|
|
7
schemas/providers/routes.d.ts
vendored
7
schemas/providers/routes.d.ts
vendored
|
@ -1,7 +1,7 @@
|
||||||
import { AccessLogConfig } from "../config/access_log";
|
import { AccessLogConfig } from "../config/access_log";
|
||||||
import { accessLogExamples } from "../config/entrypoint";
|
import { accessLogExamples } from "../config/entrypoint";
|
||||||
import { MiddlewaresMap } from "../middlewares/middlewares";
|
import { MiddlewaresMap } from "../middlewares/middlewares";
|
||||||
import { Hostname, IPv4, IPv6, PathPattern, Port, StreamPort } from "../types";
|
import { Duration, Hostname, IPv4, IPv6, PathPattern, Port, StreamPort } from "../types";
|
||||||
import { HealthcheckConfig } from "./healthcheck";
|
import { HealthcheckConfig } from "./healthcheck";
|
||||||
import { HomepageConfig } from "./homepage";
|
import { HomepageConfig } from "./homepage";
|
||||||
import { LoadBalanceConfig } from "./loadbalance";
|
import { LoadBalanceConfig } from "./loadbalance";
|
||||||
|
@ -38,6 +38,11 @@ export type ReverseProxyRoute = {
|
||||||
* @default false
|
* @default false
|
||||||
*/
|
*/
|
||||||
no_tls_verify?: boolean;
|
no_tls_verify?: boolean;
|
||||||
|
/** Response header timeout
|
||||||
|
*
|
||||||
|
* @default 60s
|
||||||
|
*/
|
||||||
|
response_header_timeout?: Duration;
|
||||||
/** Path patterns (only patterns that match will be proxied).
|
/** Path patterns (only patterns that match will be proxied).
|
||||||
*
|
*
|
||||||
* See https://pkg.go.dev/net/http#hdr-Patterns-ServeMux
|
* See https://pkg.go.dev/net/http#hdr-Patterns-ServeMux
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
import { AccessLogConfig } from "../config/access_log";
|
import { AccessLogConfig } from "../config/access_log";
|
||||||
import { accessLogExamples } from "../config/entrypoint";
|
import { accessLogExamples } from "../config/entrypoint";
|
||||||
import { MiddlewaresMap } from "../middlewares/middlewares";
|
import { MiddlewaresMap } from "../middlewares/middlewares";
|
||||||
import { Hostname, IPv4, IPv6, PathPattern, Port, StreamPort } from "../types";
|
import { Duration, Hostname, IPv4, IPv6, PathPattern, Port, StreamPort } from "../types";
|
||||||
import { HealthcheckConfig } from "./healthcheck";
|
import { HealthcheckConfig } from "./healthcheck";
|
||||||
import { HomepageConfig } from "./homepage";
|
import { HomepageConfig } from "./homepage";
|
||||||
import { LoadBalanceConfig } from "./loadbalance";
|
import { LoadBalanceConfig } from "./loadbalance";
|
||||||
|
@ -41,6 +41,11 @@ export type ReverseProxyRoute = {
|
||||||
* @default false
|
* @default false
|
||||||
*/
|
*/
|
||||||
no_tls_verify?: boolean;
|
no_tls_verify?: boolean;
|
||||||
|
/** Response header timeout
|
||||||
|
*
|
||||||
|
* @default 60s
|
||||||
|
*/
|
||||||
|
response_header_timeout?: Duration;
|
||||||
/** Path patterns (only patterns that match will be proxied).
|
/** Path patterns (only patterns that match will be proxied).
|
||||||
*
|
*
|
||||||
* See https://pkg.go.dev/net/http#hdr-Patterns-ServeMux
|
* See https://pkg.go.dev/net/http#hdr-Patterns-ServeMux
|
||||||
|
|
File diff suppressed because one or more lines are too long
Loading…
Add table
Reference in a new issue