telanflow / mps

MPS is a high-performance HTTP(S) proxy library that supports forward proxies, reverse proxies, man-in-the-middle proxies, tunnel proxies, Websocket proxies. MPS 是一个高性能HTTP(s)中间代理库,它支持正向代理、反向代理、中间人代理、隧道代理、Websocket代理
BSD 3-Clause "New" or "Revised" License
95 stars 17 forks source link
agent forward forward-proxy go-proxy goproxy http-proxy https-proxy man-in-the-middle middleware mitm mitmproxy mps proxies proxy proxy-server reverse reverse-proxy socks5-proxy tunnel-proxy weksocket-proxy


MPS

English | 🇨🇳中文

📖 Introduction

MPS stars GitHub release (latest SemVer) GitHub go.mod Go version license

MPS (middle-proxy-server) is an high-performance middle proxy library. support HTTP, HTTPS, Websocket, ForwardProxy, ReverseProxy, TunnelProxy, MitmProxy.

🚀 Features

🧰 Install

go get -u github.com/telanflow/mps

🛠 How to use

A simple proxy service

package main

import (
    "github.com/telanflow/mps"
    "log"
    "net/http"
)

func main() {
    proxy := mps.NewHttpProxy()
    log.Fatal(http.ListenAndServe(":8080", proxy))
}

More examples

🧬 Middleware

Middleware can intercept requests and responses. we have several middleware implementations built in, including BasicAuth

func main() {
    proxy := mps.NewHttpProxy()

    proxy.Use(mps.MiddlewareFunc(func(req *http.Request, ctx *mps.Context) (*http.Response, error) {
        log.Printf("[INFO] middleware -- %s %s", req.Method, req.URL)
        return ctx.Next(req)
    }))

    proxy.UseFunc(func(req *http.Request, ctx *mps.Context) (*http.Response, error) {
        log.Printf("[INFO] middleware -- %s %s", req.Method, req.URL)
        resp, err := ctx.Next(req)
        if err != nil {
            return nil, err
        }
        log.Printf("[INFO] resp -- %d", resp.StatusCode)
        return resp, err
    })

    log.Fatal(http.ListenAndServe(":8080", proxy))
}

♻️ Filters

Filters can filter requests and responses for unified processing. It is based on middleware implementation.

func main() {
    proxy := mps.NewHttpProxy()

    // request Filter Group
    reqGroup := proxy.OnRequest(mps.FilterHostMatches(regexp.MustCompile("^.*$")))
    reqGroup.DoFunc(func(req *http.Request, ctx *mps.Context) (*http.Request, *http.Response) {
        log.Printf("[INFO] req -- %s %s", req.Method, req.URL)
        return req, nil
    })

    // response Filter Group
    respGroup := proxy.OnResponse()
    respGroup.DoFunc(func(resp *http.Response, err error, ctx *mps.Context) (*http.Response, error) {
        if err != nil {
            log.Printf("[ERRO] resp -- %s %v", ctx.Request.Method, err)
            return nil, err
        }

        log.Printf("[INFO] resp -- %d", resp.StatusCode)
        return resp, err
    })

    log.Fatal(http.ListenAndServe(":8080", proxy))
}

📄 License

Source code in MPS is available under the BSD 3 License.