Documentation ¶
Overview ¶
httransform is a framework to build a various MITM proxies.
This framework is built using fasthttp (https://github.com/valyala/fasthttp) library to provide fast processing of HTTP requests. Also, as fasthttp it actively uses object pooling to reduce the pressure on GC and possibly save a little bit of memory. Unlike its alternative, goproxy (https://github.com/elazarl/goproxy), httransform does not have disadvantages of using net/http: we can keep header case and order.
This framework provides features to build robust high-performant HTTP and HTTPS proxies (with the support of the CONNECT method and TLS certificate generation on-the-fly), it supports middleware layers and custom executors. It is also able to correctly process different http connection upgrades like websocket support.
Layers are middlewares which do preprocess of the requests or postprocessing of the response. The thing about layers is that you have to define both directions: to executor and from executor. We encourage to create layers which know as less as possible about each other. If, for example, you raise an error in one layer, this error has to be processed only there, other layers should ignore that. This framework does not restrict any deviations from this rule, but you'll get more simple and clean design if you treat layers as independent as possible.
An executor is some function which converts HTTP request to response. In the most simple case, an executor is HTTP client. But also, you can convert the request to JSON, send it somewhere, get ProtoBuf back and convert it to HTTP response. Or you can play with NATS. Or 0mq. Or RabbitMQ. You got the idea. Executor defines the function which converts HTTP request to HTTP response. If connection upgrade is required, this is a responsibility of the executor to make it.
If any of your layers creates an error, executor won't be called. HTTP response will be converted to 500 response and error would be propagated by the chain of layers back.
A Mental Scheme of the Request ¶
Just take a look here:
HTTP interface Layer 1 Layer 2 +----------------+ ************** ************** | | * * * * ============== ---> | HTTP request | ===> * OnRequest * ===> * OnRequest * ===> = = | | * * * * = = +----------------+ ************** ************** = Executor = | | * * * * = = <--- | HTTP response | <=== * OnResponse * <=== * OnResponse * <=== = = | | * * * * ============== +----------------+ ************** **************
As you see, the request goes through the all layers forward and backward. This is a contract of this package.
Features ¶
1. Interface of HTTP proxy
2. Interface of HTTPS proxy (e.g CONNECT method)
3. CONNECT method can be used to establish plain TCP tunnels. Upgrade to TLS is not mandatory.
4. Both HTTP request and responses can be processed: headers are added/removed/changed and so on.
5. TCP connection upgrade is supported. Websockets are supported. But by default you can't interfere: you can just watch.
Index ¶
- Constants
- type Server
- type ServerOpts
- func (s *ServerOpts) GetAuthenticator() auth.Interface
- func (s *ServerOpts) GetConcurrency() int
- func (s *ServerOpts) GetEventProcessorFactory() events.ProcessorFactory
- func (s *ServerOpts) GetExecutor() executor.Executor
- func (s *ServerOpts) GetLayers() []layers.Layer
- func (s *ServerOpts) GetMaxRequestBodySize() int
- func (s *ServerOpts) GetReadBufferSize() int
- func (s *ServerOpts) GetReadTimeout() time.Duration
- func (s *ServerOpts) GetTCPKeepAlivePeriod() time.Duration
- func (s *ServerOpts) GetTLSCertCA() []byte
- func (s *ServerOpts) GetTLSPrivateKey() []byte
- func (s *ServerOpts) GetTLSSkipVerify() bool
- func (s *ServerOpts) GetWriteBufferSize() int
- func (s *ServerOpts) GetWriteTimeout() time.Duration
Examples ¶
Constants ¶
const ( // DefaultConcurrency defines a default number of concurrently // managed requests processed by a proxy. DefaultConcurrency = 65536 // DefaultReadBufferSize defines a default size of the buffer to use // on reading client requests. DefaultReadBufferSize = 16 * 1024 // DefaultWriteBufferSize defines a default size of the buffer to // use on writing to client socket. DefaultWriteBufferSize = 16 * 1024 // DefaultReadTimeout defines a default timeout for reading of // client request. DefaultReadTimeout = time.Minute // DefaultWriteTimeout defines a default timeout for writing // to client. DefaultWriteTimeout = time.Minute // DefaultTCPKeepAlivePeriod defines a default time period for TCP // keepalive probes. DefaultTCPKeepAlivePeriod = 30 * time.Second // DefaultMaxRequestBodySize defines a max size of the request body. DefaultMaxRequestBodySize = 1024 * 1024 * 100 )
Variables ¶
This section is empty.
Functions ¶
This section is empty.
Types ¶
type Server ¶
type Server struct {
// contains filtered or unexported fields
}
Server defines a MITM proxy instance. Please pay attention that it has its own context. If this context is cancelled, Server starts to gracefully terminate.
Example (ProxyExecutor) ¶
dialer, _ := dialers.DialerFromURL(dialers.Opts{}, "http://user:password@myproxy.host:3128") opts := httransform.ServerOpts{ Executor: executor.MakeDefaultExecutor(dialer), } proxy, _ := httransform.NewServer(context.Background(), opts) listener, _ := net.Listen("tcp", ":3128") proxy.Serve(listener)
Output:
type ServerOpts ¶
type ServerOpts struct { // Concurrency defines a number of concurrently managed requests. Concurrency uint // ReadBufferSize defines a size of the buffer allocated for reading // from client socket. ReadBufferSize uint // WriteBufferSize defines a size of the buffer allocated for // writing to a client socket. WriteBufferSize uint // MaxRequestBodySize defines a max size of the request body. MaxRequestBodySize uint // ReadTimeout defines a timeout for reading from client socket. ReadTimeout time.Duration // WriteTimeout defines a timeout for writing to client socket. WriteTimeout time.Duration // TCPKeepAlivePeriod defines a time period between 2 consecutive // TCP keepalive probes. TCPKeepAlivePeriod time.Duration // EventProcessorFactory defines a factory method which produces // event processors. EventProcessorFactory events.ProcessorFactory // TLSCertCA is a bytes which contains TLS CA certificate. This // certificate is required for generating fake TLS certifiates for // websites on TLS connection upgrades. TLSCertCA []byte // TLSPrivateKey is a bytes which contains TLS private key. This // certificate is required for generating fake TLS certifiates for // websites on TLS connection upgrades. TLSPrivateKey []byte // Layers defines a list of layers, middleware which should be used // by proxy. Layers []layers.Layer // Executor defines an executor function which should be used // to terminate HTTP request and fill HTTP response. Executor executor.Executor // Authenticator is an interface which is used to authenticate a // request. Authenticator auth.Interface // TLSSkipVerify defines if we need to verify TLS certifiates we have // to deal with. TLSSkipVerify bool }
ServerOpts defines server options to use.
Please pay attention that each field is optional. We do provide sane defaults if you do not want to pass anything there.
func (*ServerOpts) GetAuthenticator ¶
func (s *ServerOpts) GetAuthenticator() auth.Interface
GetLayers returns an authenticator instance to use paying attention to default value (no auth).
func (*ServerOpts) GetConcurrency ¶
func (s *ServerOpts) GetConcurrency() int
GetConcurrency returns a concurrency paying attention to default value.
func (*ServerOpts) GetEventProcessorFactory ¶
func (s *ServerOpts) GetEventProcessorFactory() events.ProcessorFactory
GetEventProcessorFactory returns an event factory paying attention to default value.
func (*ServerOpts) GetExecutor ¶
func (s *ServerOpts) GetExecutor() executor.Executor
GetExecutor returns an instance of executor to use.
func (*ServerOpts) GetLayers ¶
func (s *ServerOpts) GetLayers() []layers.Layer
GetLayers returns a set of server layers to use.
func (*ServerOpts) GetMaxRequestBodySize ¶
func (s *ServerOpts) GetMaxRequestBodySize() int
GetMaxRequestBodySize returns max request body size paying attention to default value.
func (*ServerOpts) GetReadBufferSize ¶
func (s *ServerOpts) GetReadBufferSize() int
GetReadBufferSize returns a read buffer size paying attention to default value.
func (*ServerOpts) GetReadTimeout ¶
func (s *ServerOpts) GetReadTimeout() time.Duration
GetReadTimeout returns a read timeout paying attention to default value.
func (*ServerOpts) GetTCPKeepAlivePeriod ¶
func (s *ServerOpts) GetTCPKeepAlivePeriod() time.Duration
GetTCPKeepAlivePeriod returns a period for TCP keepalive probes paying attention to default value.
func (*ServerOpts) GetTLSCertCA ¶
func (s *ServerOpts) GetTLSCertCA() []byte
GetTLSCertCA returns a given TLS CA certificate.
func (*ServerOpts) GetTLSPrivateKey ¶
func (s *ServerOpts) GetTLSPrivateKey() []byte
GetTLSPrivateKey returns a given TLS private key.
func (*ServerOpts) GetTLSSkipVerify ¶
func (s *ServerOpts) GetTLSSkipVerify() bool
GetTLSSkipVerify returns a sign if we need to skip TLS verification.
func (*ServerOpts) GetWriteBufferSize ¶
func (s *ServerOpts) GetWriteBufferSize() int
GetWriteBufferSize returns a write buffer size paying attention to default value.
func (*ServerOpts) GetWriteTimeout ¶
func (s *ServerOpts) GetWriteTimeout() time.Duration
GetWriteTimeout returns a write timeout paying attention to default value.
Directories ¶
Path | Synopsis |
---|---|
Authenticators interface and implementations.
|
Authenticators interface and implementations. |
Lifecycle management of generated TLS certificates.
|
Lifecycle management of generated TLS certificates. |
A wrapper for LRU/LFU cache used by httransform The thing is that there are many (good) caching libraries available in Go.
|
A wrapper for LRU/LFU cache used by httransform The thing is that there are many (good) caching libraries available in Go. |
A set of utilities related to connections.
|
A set of utilities related to connections. |
Implementation of different dialers.
|
Implementation of different dialers. |
Cachning DNS resolver.
|
Cachning DNS resolver. |
Custom errors.
|
Custom errors. |
Event stream implementation.
|
Event stream implementation. |
Default implementation of executor.
|
Default implementation of executor. |
Header and Headers implementation.
|
Header and Headers implementation. |
A custom implementation of HTTP request sender.
|
A custom implementation of HTTP request sender. |
Context and layers.
|
Context and layers. |
Different connection upgraders.
|
Different connection upgraders. |