modulepackage
0.0.0-20240224075916-9b5982a00834
Repository: https://github.com/kittizz/httpproxy.git
Documentation: pkg.go.dev
# README
Go HTTP proxy server library
Package httpproxy provides a customizable HTTP proxy; supports HTTP, HTTPS through CONNECT. And also provides HTTPS connection using "Man in the Middle" style attack.
It's easy to use. httpproxy.Proxy
implements Handler
interface of net/http
package to offer http.ListenAndServe
function.
Installing
go get -u github.com/kittizz/httpproxy
# or
go get -u gopkg.in/httpproxy.v1
Usage
Library has two significant structs: Proxy and Context.
Proxy struct
// Proxy defines parameters for running an HTTP Proxy. It implements
// http.Handler interface for ListenAndServe function. If you need, you must
// set Proxy struct before handling requests.
type Proxy struct {
// Session number of last proxy request.
SessionNo int64
// RoundTripper interface to obtain remote response.
// By default, it uses &http.Transport{}.
Rt http.RoundTripper
// Certificate key pair.
Ca tls.Certificate
// User data to use free.
UserData interface{}
// Error callback.
OnError func(ctx *Context, where string, err *Error, opErr error)
// Accept callback. It greets proxy request like ServeHTTP function of
// http.Handler.
// If it returns true, stops processing proxy request.
OnAccept func(ctx *Context, w http.ResponseWriter, r *http.Request) bool
// Auth callback. If you need authentication, set this callback.
// If it returns true, authentication succeeded.
OnAuth func(ctx *Context, authType string, user string, pass string) bool
// Connect callback. It sets connect action and new host.
// If len(newhost) > 0, host changes.
OnConnect func(ctx *Context, host string) (ConnectAction ConnectAction,
newHost string)
// Request callback. It greets remote request.
// If it returns non-nil response, stops processing remote request.
OnRequest func(ctx *Context, req *http.Request) (resp *http.Response)
// Response callback. It greets remote response.
// Remote response sends after this callback.
OnResponse func(ctx *Context, req *http.Request, resp *http.Response)
// If ConnectAction is ConnectMitm, it sets chunked to Transfer-Encoding.
// By default, true.
MitmChunked bool
// HTTP Authentication type. If it's not specified (""), uses "Basic".
// By default, "".
AuthType string
}
Context struct
// Context keeps context of each proxy request.
type Context struct {
// Pointer of Proxy struct handled this context.
// It's using internally. Don't change in Context struct!
Prx *Proxy
// Session number of this context obtained from Proxy struct.
SessionNo int64
// Sub session number of processing remote connection.
SubSessionNo int64
// Original Proxy request.
// It's using internally. Don't change in Context struct!
Req *http.Request
// Original Proxy request, if proxy request method is CONNECT.
// It's using internally. Don't change in Context struct!
ConnectReq *http.Request
// Action of after the CONNECT, if proxy request method is CONNECT.
// It's using internally. Don't change in Context struct!
ConnectAction ConnectAction
// Remote host, if proxy request method is CONNECT.
// It's using internally. Don't change in Context struct!
ConnectHost string
// User data to use free.
UserData interface{}
}
Examples
For more examples, examples/
examples/go-httpproxy-simple
package main
import (
"log"
"net/http"
"github.com/kittizz/httpproxy"
)
func OnError(ctx *httpproxy.Context, where string,
err *httpproxy.Error, opErr error) {
// Log errors.
log.Printf("ERR: %s: %s [%s]", where, err, opErr)
}
func OnAccept(ctx *httpproxy.Context, w http.ResponseWriter,
r *http.Request) bool {
// Handle local request has path "/info"
if r.Method == "GET" && !r.URL.IsAbs() && r.URL.Path == "/info" {
w.Write([]byte("This is go-httpproxy."))
return true
}
return false
}
func OnAuth(ctx *httpproxy.Context, authType string, user string, pass string) bool {
// Auth test user.
if user == "test" && pass == "1234" {
return true
}
return false
}
func OnConnect(ctx *httpproxy.Context, host string) (
ConnectAction httpproxy.ConnectAction, newHost string) {
// Apply "Man in the Middle" to all ssl connections. Never change host.
return httpproxy.ConnectMitm, host
}
func OnRequest(ctx *httpproxy.Context, req *http.Request) (
resp *http.Response) {
// Log proxying requests.
log.Printf("INFO: Proxy: %s %s", req.Method, req.URL.String())
return
}
func OnResponse(ctx *httpproxy.Context, req *http.Request,
resp *http.Response) {
// Add header "Via: go-httpproxy".
resp.Header.Add("Via", "go-httpproxy")
}
func main() {
// Create a new proxy with default certificate pair.
prx, _ := httpproxy.NewProxy()
// Set handlers.
prx.OnError = OnError
prx.OnAccept = OnAccept
prx.OnAuth = OnAuth
prx.OnConnect = OnConnect
prx.OnRequest = OnRequest
prx.OnResponse = OnResponse
// Listen...
http.ListenAndServe(":8080", prx)
}
# Functions
No description provided by the author
No description provided by the author
InMemoryResponse creates new HTTP response given arguments.
NewCaSigner returns a new CaSigner without caching.
NewCaSignerCache returns a new CaSigner with caching given max.
NewConnResponseWriter returns a new ConnResponseWriter.
NewError returns a new Error.
NewProxy returns a new Proxy has default CA certificate and key.
NewProxyCert returns a new Proxy given CA certificate and key.
ServeInMemory serves HTTP response given arguments to http.ResponseWriter.
ServeResponse serves HTTP response to http.ResponseWriter.
SignHosts generates TLS certificate given hosts, signed by CA certificate.
# Constants
ConnectMitm specifies proxy "Man in the Middle" style attack after the CONNECT.
ConnectNone specifies that proxy request is not CONNECT.
ConnectProxy specifies directly socket proxy after the CONNECT.
# Variables
DefaultCaCert provides default CA certificate.
DefaultCaKey provides default CA key.
Library specific errors.
Library specific errors.
Library specific errors.
Library specific errors.
Library specific errors.
Library specific errors.
Library specific errors.
Library specific errors.
Library specific errors.
Library specific errors.
Library specific errors.
# Structs
CaSigner is a certificate signer by CA certificate.
ConnResponseWriter implements http.ResponseWriter interface to use hijacked HTTP connection.
Context keeps context of each proxy request.
Error struct is base of library specific errors.
Proxy defines parameters for running an HTTP Proxy.
# Type aliases
ConnectAction specifies action of after the CONNECT.