mirror of https://github.com/k3s-io/k3s
Merge pull request #44113 from mikkeloscar/update-goproxy
Automatic merge from submit-queue
vendor: Update elazarl/goproxy to fix e2e test with go1.8
**What this PR does / why we need it**:
This updates the dependency `github.com/elazarl/goproxy` to include this fix c4fc26588b
which makes kubernetes e2e tests build with go1.8. It was crashing before as described in https://github.com/elazarl/goproxy/issues/188#issuecomment-281092250 and #38228
**Which issue this PR fixes**
This is part of the fix for #38228
**Special notes for your reviewer**:
**Release note**:
```release-note
```
pull/6/head
commit
dee81ed56a
|
@ -960,8 +960,8 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ImportPath": "github.com/elazarl/goproxy",
|
"ImportPath": "github.com/elazarl/goproxy",
|
||||||
"Comment": "v1.0-66-g07b16b6",
|
"Comment": "v1.0-104-gc4fc265",
|
||||||
"Rev": "07b16b6e30fcac0ad8c0435548e743bcf2ca7e92"
|
"Rev": "c4fc26588b6ef8af07a191fcb6476387bdd46711"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ImportPath": "github.com/emicklei/go-restful",
|
"ImportPath": "github.com/emicklei/go-restful",
|
||||||
|
|
|
@ -28,7 +28,7 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ImportPath": "github.com/elazarl/goproxy",
|
"ImportPath": "github.com/elazarl/goproxy",
|
||||||
"Rev": "07b16b6e30fcac0ad8c0435548e743bcf2ca7e92"
|
"Rev": "c4fc26588b6ef8af07a191fcb6476387bdd46711"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ImportPath": "github.com/emicklei/go-restful",
|
"ImportPath": "github.com/emicklei/go-restful",
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
# Introduction
|
# Introduction
|
||||||
|
|
||||||
|
[![GoDoc](https://godoc.org/github.com/elazarl/goproxy?status.svg)](https://godoc.org/github.com/elazarl/goproxy)
|
||||||
[![Join the chat at https://gitter.im/elazarl/goproxy](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/elazarl/goproxy?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
|
[![Join the chat at https://gitter.im/elazarl/goproxy](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/elazarl/goproxy?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
|
||||||
|
|
||||||
Package goproxy provides a customizable HTTP proxy library for Go (golang),
|
Package goproxy provides a customizable HTTP proxy library for Go (golang),
|
||||||
|
@ -8,7 +9,7 @@ It supports regular HTTP proxy, HTTPS through CONNECT, and "hijacking" HTTPS
|
||||||
connection using "Man in the Middle" style attack.
|
connection using "Man in the Middle" style attack.
|
||||||
|
|
||||||
The intent of the proxy, is to be usable with reasonable amount of traffic
|
The intent of the proxy, is to be usable with reasonable amount of traffic
|
||||||
yet, customizable and programable.
|
yet, customizable and programmable.
|
||||||
|
|
||||||
The proxy itself is simply a `net/http` handler.
|
The proxy itself is simply a `net/http` handler.
|
||||||
|
|
||||||
|
@ -35,7 +36,7 @@ as customable as goproxy intend to be. The main difference is, Fiddler is not
|
||||||
intended to be used as a real proxy.
|
intended to be used as a real proxy.
|
||||||
|
|
||||||
A possible use case that suits goproxy but
|
A possible use case that suits goproxy but
|
||||||
not Fiddler, is, gathering statisitics on page load times for a certain website over a week.
|
not Fiddler, is, gathering statistics on page load times for a certain website over a week.
|
||||||
With goproxy you could ask all your users to set their proxy to a dedicated machine running a
|
With goproxy you could ask all your users to set their proxy to a dedicated machine running a
|
||||||
goproxy server. Fiddler is a GUI app not designed to be ran like a server for multiple users.
|
goproxy server. Fiddler is a GUI app not designed to be ran like a server for multiple users.
|
||||||
|
|
||||||
|
@ -43,27 +44,31 @@ goproxy server. Fiddler is a GUI app not designed to be ran like a server for mu
|
||||||
|
|
||||||
To get a taste of `goproxy`, a basic HTTP/HTTPS transparent proxy
|
To get a taste of `goproxy`, a basic HTTP/HTTPS transparent proxy
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/elazarl/goproxy"
|
"github.com/elazarl/goproxy"
|
||||||
"log"
|
"log"
|
||||||
"net/http"
|
"net/http"
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
|
||||||
proxy := goproxy.NewProxyHttpServer()
|
|
||||||
proxy.Verbose = true
|
|
||||||
log.Fatal(http.ListenAndServe(":8080", proxy))
|
|
||||||
}
|
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
proxy := goproxy.NewProxyHttpServer()
|
||||||
|
proxy.Verbose = true
|
||||||
|
log.Fatal(http.ListenAndServe(":8080", proxy))
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
This line will add `X-GoProxy: yxorPoG-X` header to all requests sent through the proxy
|
This line will add `X-GoProxy: yxorPoG-X` header to all requests sent through the proxy
|
||||||
|
|
||||||
proxy.OnRequest().DoFunc(
|
```go
|
||||||
func(r *http.Request,ctx *goproxy.ProxyCtx)(*http.Request,*http.Response) {
|
proxy.OnRequest().DoFunc(
|
||||||
r.Header.Set("X-GoProxy","yxorPoG-X")
|
func(r *http.Request,ctx *goproxy.ProxyCtx)(*http.Request,*http.Response) {
|
||||||
return r,nil
|
r.Header.Set("X-GoProxy","yxorPoG-X")
|
||||||
})
|
return r,nil
|
||||||
|
})
|
||||||
|
```
|
||||||
|
|
||||||
`DoFunc` will process all incoming requests to the proxy. It will add a header to the request
|
`DoFunc` will process all incoming requests to the proxy. It will add a header to the request
|
||||||
and return it. The proxy will send the modified request.
|
and return it. The proxy will send the modified request.
|
||||||
|
@ -73,21 +78,23 @@ have discarded the request and sent the new response to the client.
|
||||||
|
|
||||||
In order to refuse connections to reddit at work time
|
In order to refuse connections to reddit at work time
|
||||||
|
|
||||||
proxy.OnRequest(goproxy.DstHostIs("www.reddit.com")).DoFunc(
|
```go
|
||||||
func(r *http.Request,ctx *goproxy.ProxyCtx)(*http.Request,*http.Response) {
|
proxy.OnRequest(goproxy.DstHostIs("www.reddit.com")).DoFunc(
|
||||||
if h,_,_ := time.Now().Clock(); h >= 8 && h <= 17 {
|
func(r *http.Request,ctx *goproxy.ProxyCtx)(*http.Request,*http.Response) {
|
||||||
return r,goproxy.NewResponse(r,
|
if h,_,_ := time.Now().Clock(); h >= 8 && h <= 17 {
|
||||||
goproxy.ContentTypeText,http.StatusForbidden,
|
return r,goproxy.NewResponse(r,
|
||||||
"Don't waste your time!")
|
goproxy.ContentTypeText,http.StatusForbidden,
|
||||||
}
|
"Don't waste your time!")
|
||||||
return r,nil
|
}
|
||||||
})
|
return r,nil
|
||||||
|
})
|
||||||
|
```
|
||||||
|
|
||||||
`DstHostIs` returns a `ReqCondition`, that is a function receiving a `Request` and returning a boolean
|
`DstHostIs` returns a `ReqCondition`, that is a function receiving a `Request` and returning a boolean
|
||||||
we will only process requests that matches the condition. `DstHostIs("www.reddit.com")` will return
|
we will only process requests that matches the condition. `DstHostIs("www.reddit.com")` will return
|
||||||
a `ReqCondition` accepting only requests directed to "www.reddit.com".
|
a `ReqCondition` accepting only requests directed to "www.reddit.com".
|
||||||
|
|
||||||
`DoFunc` will recieve a function that will preprocess the request. We can change the request, or
|
`DoFunc` will receive a function that will preprocess the request. We can change the request, or
|
||||||
return a response. If the time is between 8:00am and 17:00pm, we will neglect the request, and
|
return a response. If the time is between 8:00am and 17:00pm, we will neglect the request, and
|
||||||
return a precanned text response saying "do not waste your time".
|
return a precanned text response saying "do not waste your time".
|
||||||
|
|
||||||
|
@ -102,7 +109,7 @@ See additional examples in the examples directory.
|
||||||
# License
|
# License
|
||||||
|
|
||||||
I put the software temporarily under the Go-compatible BSD license,
|
I put the software temporarily under the Go-compatible BSD license,
|
||||||
if this prevents someone from using the software, do let mee know and I'll consider changing it.
|
if this prevents someone from using the software, do let me know and I'll consider changing it.
|
||||||
|
|
||||||
At any rate, user feedback is very important for me, so I'll be delighted to know if you're using this package.
|
At any rate, user feedback is very important for me, so I'll be delighted to know if you're using this package.
|
||||||
|
|
||||||
|
@ -111,5 +118,5 @@ At any rate, user feedback is very important for me, so I'll be delighted to kno
|
||||||
I've received a positive feedback from a few people who use goproxy in production settings.
|
I've received a positive feedback from a few people who use goproxy in production settings.
|
||||||
I believe it is good enough for usage.
|
I believe it is good enough for usage.
|
||||||
|
|
||||||
I'll try to keep reasonable backwards compatability. In case of a major API change,
|
I'll try to keep reasonable backwards compatibility. In case of a major API change,
|
||||||
I'll change the import path.
|
I'll change the import path.
|
||||||
|
|
|
@ -22,35 +22,90 @@ var defaultTLSConfig = &tls.Config{
|
||||||
}
|
}
|
||||||
|
|
||||||
var CA_CERT = []byte(`-----BEGIN CERTIFICATE-----
|
var CA_CERT = []byte(`-----BEGIN CERTIFICATE-----
|
||||||
MIICSjCCAbWgAwIBAgIBADALBgkqhkiG9w0BAQUwSjEjMCEGA1UEChMaZ2l0aHVi
|
MIIF9DCCA9ygAwIBAgIJAODqYUwoVjJkMA0GCSqGSIb3DQEBCwUAMIGOMQswCQYD
|
||||||
LmNvbS9lbGF6YXJsL2dvcHJveHkxIzAhBgNVBAMTGmdpdGh1Yi5jb20vZWxhemFy
|
VQQGEwJJTDEPMA0GA1UECAwGQ2VudGVyMQwwCgYDVQQHDANMb2QxEDAOBgNVBAoM
|
||||||
bC9nb3Byb3h5MB4XDTAwMDEwMTAwMDAwMFoXDTQ5MTIzMTIzNTk1OVowSjEjMCEG
|
B0dvUHJveHkxEDAOBgNVBAsMB0dvUHJveHkxGjAYBgNVBAMMEWdvcHJveHkuZ2l0
|
||||||
A1UEChMaZ2l0aHViLmNvbS9lbGF6YXJsL2dvcHJveHkxIzAhBgNVBAMTGmdpdGh1
|
aHViLmlvMSAwHgYJKoZIhvcNAQkBFhFlbGF6YXJsQGdtYWlsLmNvbTAeFw0xNzA0
|
||||||
Yi5jb20vZWxhemFybC9nb3Byb3h5MIGdMAsGCSqGSIb3DQEBAQOBjQAwgYkCgYEA
|
MDUyMDAwMTBaFw0zNzAzMzEyMDAwMTBaMIGOMQswCQYDVQQGEwJJTDEPMA0GA1UE
|
||||||
vz9BbCaJjxs73Tvcq3leP32hAGerQ1RgvlZ68Z4nZmoVHfl+2Nr/m0dmW+GdOfpT
|
CAwGQ2VudGVyMQwwCgYDVQQHDANMb2QxEDAOBgNVBAoMB0dvUHJveHkxEDAOBgNV
|
||||||
cs/KzfJjYGr/84x524fiuR8GdZ0HOtXJzyF5seoWnbBIuyr1PbEpgRhGQMqqOUuj
|
BAsMB0dvUHJveHkxGjAYBgNVBAMMEWdvcHJveHkuZ2l0aHViLmlvMSAwHgYJKoZI
|
||||||
YExeLbfNHPIoJ8XZ1Vzyv3YxjbmjWA+S/uOe9HWtDbMCAwEAAaNGMEQwDgYDVR0P
|
hvcNAQkBFhFlbGF6YXJsQGdtYWlsLmNvbTCCAiIwDQYJKoZIhvcNAQEBBQADggIP
|
||||||
AQH/BAQDAgCkMBMGA1UdJQQMMAoGCCsGAQUFBwMBMA8GA1UdEwEB/wQFMAMBAf8w
|
ADCCAgoCggIBAJ4Qy+H6hhoY1s0QRcvIhxrjSHaO/RbaFj3rwqcnpOgFq07gRdI9
|
||||||
DAYDVR0RBAUwA4IBKjALBgkqhkiG9w0BAQUDgYEAIcL8huSmGMompNujsvePTUnM
|
3c0TFKQJHpgv6feLRhEvX/YllFYu4J35lM9ZcYY4qlKFuStcX8Jm8fqpgtmAMBzP
|
||||||
oEUKtX4Eh/+s+DSfV/TyI0I+3GiPpLplEgFWuoBIJGios0r1dKh5N0TGjxX/RmGm
|
sqtqDi8M9RQGKENzU9IFOnCV7SAeh45scMuI3wz8wrjBcH7zquHkvqUSYZz035t9
|
||||||
qo7E4jjJuo8Gs5U8/fgThZmshax2lwLtbRNwhvUVr65GdahLsZz8I+hySLuatVvR
|
V6WTrHyTEvT4w+lFOVN2bA/6DAIxrjBiF6DhoJqnha0SZtDfv77XpwGG3EhA/qoh
|
||||||
qHHq/FQORIiNyNpq/Hg=
|
hiYrDruYK7zJdESQL44LwzMPupVigqalfv+YHfQjbhT951IVurW2NJgRyBE62dLr
|
||||||
|
lHYdtT9tCTCrd+KJNMJ+jp9hAjdIu1Br/kifU4F4+4ZLMR9Ueji0GkkPKsYdyMnq
|
||||||
|
j0p0PogyvP1l4qmboPImMYtaoFuYmMYlebgC9LN10bL91K4+jLt0I1YntEzrqgJo
|
||||||
|
WsJztYDw543NzSy5W+/cq4XRYgtq1b0RWwuUiswezmMoeyHZ8BQJe2xMjAOllASD
|
||||||
|
fqa8OK3WABHJpy4zUrnUBiMuPITzD/FuDx4C5IwwlC68gHAZblNqpBZCX0nFCtKj
|
||||||
|
YOcI2So5HbQ2OC8QF+zGVuduHUSok4hSy2BBfZ1pfvziqBeetWJwFvapGB44nIHh
|
||||||
|
WKNKvqOxLNIy7e+TGRiWOomrAWM18VSR9LZbBxpJK7PLSzWqYJYTRCZHAgMBAAGj
|
||||||
|
UzBRMB0GA1UdDgQWBBR4uDD9Y6x7iUoHO+32ioOcw1ICZTAfBgNVHSMEGDAWgBR4
|
||||||
|
uDD9Y6x7iUoHO+32ioOcw1ICZTAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEB
|
||||||
|
CwUAA4ICAQAaCEupzGGqcdh+L7BzhX7zyd7yzAKUoLxFrxaZY34Xyj3lcx1XoK6F
|
||||||
|
AqsH2JM25GixgadzhNt92JP7vzoWeHZtLfstrPS638Y1zZi6toy4E49viYjFk5J0
|
||||||
|
C6ZcFC04VYWWx6z0HwJuAS08tZ37JuFXpJGfXJOjZCQyxse0Lg0tuKLMeXDCk2Y3
|
||||||
|
Ba0noeuNyHRoWXXPyiUoeApkVCU5gIsyiJSWOjhJ5hpJG06rQNfNYexgKrrraEin
|
||||||
|
o0jmEMtJMx5TtD83hSnLCnFGBBq5lkE7jgXME1KsbIE3lJZzRX1mQwUK8CJDYxye
|
||||||
|
i6M/dzSvy0SsPvz8fTAlprXRtWWtJQmxgWENp3Dv+0Pmux/l+ilk7KA4sMXGhsfr
|
||||||
|
bvTOeWl1/uoFTPYiWR/ww7QEPLq23yDFY04Q7Un0qjIk8ExvaY8lCkXMgc8i7sGY
|
||||||
|
VfvOYb0zm67EfAQl3TW8Ky5fl5CcxpVCD360Bzi6hwjYixa3qEeBggOixFQBFWft
|
||||||
|
8wrkKTHpOQXjn4sDPtet8imm9UYEtzWrFX6T9MFYkBR0/yye0FIh9+YPiTA6WB86
|
||||||
|
NCNwK5Yl6HuvF97CIH5CdgO+5C7KifUtqTOL8pQKbNwy0S3sNYvB+njGvRpR7pKV
|
||||||
|
BUnFpB/Atptqr4CUlTXrc5IPLAqAfmwk5IKcwy3EXUbruf9Dwz69YA==
|
||||||
-----END CERTIFICATE-----`)
|
-----END CERTIFICATE-----`)
|
||||||
|
|
||||||
var CA_KEY = []byte(`-----BEGIN RSA PRIVATE KEY-----
|
var CA_KEY = []byte(`-----BEGIN RSA PRIVATE KEY-----
|
||||||
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
|
||||||
-----END RSA PRIVATE KEY-----`)
|
-----END RSA PRIVATE KEY-----`)
|
||||||
|
|
||||||
var GoproxyCa, goproxyCaErr = tls.X509KeyPair(CA_CERT, CA_KEY)
|
var GoproxyCa, goproxyCaErr = tls.X509KeyPair(CA_CERT, CA_KEY)
|
||||||
|
|
|
@ -124,10 +124,15 @@ func DstHostIs(host string) ReqConditionFunc {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// SrcIpIs returns a ReqCondition testing wether the source IP of the request is the given string
|
// SrcIpIs returns a ReqCondition testing whether the source IP of the request is one of the given strings
|
||||||
func SrcIpIs(ip string) ReqCondition {
|
func SrcIpIs(ips ...string) ReqCondition {
|
||||||
return ReqConditionFunc(func(req *http.Request, ctx *ProxyCtx) bool {
|
return ReqConditionFunc(func(req *http.Request, ctx *ProxyCtx) bool {
|
||||||
return strings.HasPrefix(req.RemoteAddr, ip+":")
|
for _, ip := range ips {
|
||||||
|
if strings.HasPrefix(req.RemoteAddr, ip+":") {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -10,8 +10,10 @@ import (
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/url"
|
"net/url"
|
||||||
"os"
|
"os"
|
||||||
|
"regexp"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
"sync"
|
||||||
"sync/atomic"
|
"sync/atomic"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -23,6 +25,7 @@ const (
|
||||||
ConnectMitm
|
ConnectMitm
|
||||||
ConnectHijack
|
ConnectHijack
|
||||||
ConnectHTTPMitm
|
ConnectHTTPMitm
|
||||||
|
ConnectProxyAuthHijack
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
|
@ -30,6 +33,7 @@ var (
|
||||||
MitmConnect = &ConnectAction{Action: ConnectMitm, TLSConfig: TLSConfigFromCA(&GoproxyCa)}
|
MitmConnect = &ConnectAction{Action: ConnectMitm, TLSConfig: TLSConfigFromCA(&GoproxyCa)}
|
||||||
HTTPMitmConnect = &ConnectAction{Action: ConnectHTTPMitm, TLSConfig: TLSConfigFromCA(&GoproxyCa)}
|
HTTPMitmConnect = &ConnectAction{Action: ConnectHTTPMitm, TLSConfig: TLSConfigFromCA(&GoproxyCa)}
|
||||||
RejectConnect = &ConnectAction{Action: ConnectReject, TLSConfig: TLSConfigFromCA(&GoproxyCa)}
|
RejectConnect = &ConnectAction{Action: ConnectReject, TLSConfig: TLSConfigFromCA(&GoproxyCa)}
|
||||||
|
httpsRegexp = regexp.MustCompile(`^https:\/\/`)
|
||||||
)
|
)
|
||||||
|
|
||||||
type ConnectAction struct {
|
type ConnectAction struct {
|
||||||
|
@ -97,8 +101,25 @@ func (proxy *ProxyHttpServer) handleHttps(w http.ResponseWriter, r *http.Request
|
||||||
}
|
}
|
||||||
ctx.Logf("Accepting CONNECT to %s", host)
|
ctx.Logf("Accepting CONNECT to %s", host)
|
||||||
proxyClient.Write([]byte("HTTP/1.0 200 OK\r\n\r\n"))
|
proxyClient.Write([]byte("HTTP/1.0 200 OK\r\n\r\n"))
|
||||||
go copyAndClose(ctx, targetSiteCon, proxyClient)
|
|
||||||
go copyAndClose(ctx, proxyClient, targetSiteCon)
|
targetTCP, targetOK := targetSiteCon.(*net.TCPConn)
|
||||||
|
proxyClientTCP, clientOK := proxyClient.(*net.TCPConn)
|
||||||
|
if targetOK && clientOK {
|
||||||
|
go copyAndClose(ctx, targetTCP, proxyClientTCP)
|
||||||
|
go copyAndClose(ctx, proxyClientTCP, targetTCP)
|
||||||
|
} else {
|
||||||
|
go func() {
|
||||||
|
var wg sync.WaitGroup
|
||||||
|
wg.Add(2)
|
||||||
|
go copyOrWarn(ctx, targetSiteCon, proxyClient, &wg)
|
||||||
|
go copyOrWarn(ctx, proxyClient, targetSiteCon, &wg)
|
||||||
|
wg.Wait()
|
||||||
|
proxyClient.Close()
|
||||||
|
targetSiteCon.Close()
|
||||||
|
|
||||||
|
}()
|
||||||
|
}
|
||||||
|
|
||||||
case ConnectHijack:
|
case ConnectHijack:
|
||||||
ctx.Logf("Hijacking CONNECT to %s", host)
|
ctx.Logf("Hijacking CONNECT to %s", host)
|
||||||
proxyClient.Write([]byte("HTTP/1.0 200 OK\r\n\r\n"))
|
proxyClient.Write([]byte("HTTP/1.0 200 OK\r\n\r\n"))
|
||||||
|
@ -132,6 +153,7 @@ func (proxy *ProxyHttpServer) handleHttps(w http.ResponseWriter, r *http.Request
|
||||||
httpError(proxyClient, ctx, err)
|
httpError(proxyClient, ctx, err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
defer resp.Body.Close()
|
||||||
}
|
}
|
||||||
resp = proxy.filterResponse(resp, ctx)
|
resp = proxy.filterResponse(resp, ctx)
|
||||||
if err := resp.Write(proxyClient); err != nil {
|
if err := resp.Write(proxyClient); err != nil {
|
||||||
|
@ -166,6 +188,7 @@ func (proxy *ProxyHttpServer) handleHttps(w http.ResponseWriter, r *http.Request
|
||||||
clientTlsReader := bufio.NewReader(rawClientTls)
|
clientTlsReader := bufio.NewReader(rawClientTls)
|
||||||
for !isEof(clientTlsReader) {
|
for !isEof(clientTlsReader) {
|
||||||
req, err := http.ReadRequest(clientTlsReader)
|
req, err := http.ReadRequest(clientTlsReader)
|
||||||
|
var ctx = &ProxyCtx{Req: req, Session: atomic.AddInt64(&proxy.sess, 1), proxy: proxy}
|
||||||
if err != nil && err != io.EOF {
|
if err != nil && err != io.EOF {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -175,7 +198,10 @@ func (proxy *ProxyHttpServer) handleHttps(w http.ResponseWriter, r *http.Request
|
||||||
}
|
}
|
||||||
req.RemoteAddr = r.RemoteAddr // since we're converting the request, need to carry over the original connecting IP as well
|
req.RemoteAddr = r.RemoteAddr // since we're converting the request, need to carry over the original connecting IP as well
|
||||||
ctx.Logf("req %v", r.Host)
|
ctx.Logf("req %v", r.Host)
|
||||||
req.URL, err = url.Parse("https://" + r.Host + req.URL.String())
|
|
||||||
|
if !httpsRegexp.MatchString(req.URL.String()) {
|
||||||
|
req.URL, err = url.Parse("https://" + r.Host + req.URL.String())
|
||||||
|
}
|
||||||
|
|
||||||
// Bug fix which goproxy fails to provide request
|
// Bug fix which goproxy fails to provide request
|
||||||
// information URL in the context when does HTTPS MITM
|
// information URL in the context when does HTTPS MITM
|
||||||
|
@ -196,6 +222,8 @@ func (proxy *ProxyHttpServer) handleHttps(w http.ResponseWriter, r *http.Request
|
||||||
ctx.Logf("resp %v", resp.Status)
|
ctx.Logf("resp %v", resp.Status)
|
||||||
}
|
}
|
||||||
resp = proxy.filterResponse(resp, ctx)
|
resp = proxy.filterResponse(resp, ctx)
|
||||||
|
defer resp.Body.Close()
|
||||||
|
|
||||||
text := resp.Status
|
text := resp.Status
|
||||||
statusCode := strconv.Itoa(resp.StatusCode) + " "
|
statusCode := strconv.Itoa(resp.StatusCode) + " "
|
||||||
if strings.HasPrefix(text, statusCode) {
|
if strings.HasPrefix(text, statusCode) {
|
||||||
|
@ -234,6 +262,9 @@ func (proxy *ProxyHttpServer) handleHttps(w http.ResponseWriter, r *http.Request
|
||||||
}
|
}
|
||||||
ctx.Logf("Exiting on EOF")
|
ctx.Logf("Exiting on EOF")
|
||||||
}()
|
}()
|
||||||
|
case ConnectProxyAuthHijack:
|
||||||
|
proxyClient.Write([]byte("HTTP/1.1 407 Proxy Authentication Required\r\n"))
|
||||||
|
todo.Hijack(r, proxyClient, ctx)
|
||||||
case ConnectReject:
|
case ConnectReject:
|
||||||
if ctx.Resp != nil {
|
if ctx.Resp != nil {
|
||||||
if err := ctx.Resp.Write(proxyClient); err != nil {
|
if err := ctx.Resp.Write(proxyClient); err != nil {
|
||||||
|
@ -253,15 +284,20 @@ func httpError(w io.WriteCloser, ctx *ProxyCtx, err error) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func copyAndClose(ctx *ProxyCtx, w, r net.Conn) {
|
func copyOrWarn(ctx *ProxyCtx, dst io.Writer, src io.Reader, wg *sync.WaitGroup) {
|
||||||
connOk := true
|
if _, err := io.Copy(dst, src); err != nil {
|
||||||
if _, err := io.Copy(w, r); err != nil {
|
|
||||||
connOk = false
|
|
||||||
ctx.Warnf("Error copying to client: %s", err)
|
ctx.Warnf("Error copying to client: %s", err)
|
||||||
}
|
}
|
||||||
if err := r.Close(); err != nil && connOk {
|
wg.Done()
|
||||||
ctx.Warnf("Error closing: %s", err)
|
}
|
||||||
|
|
||||||
|
func copyAndClose(ctx *ProxyCtx, dst, src *net.TCPConn) {
|
||||||
|
if _, err := io.Copy(dst, src); err != nil {
|
||||||
|
ctx.Warnf("Error copying to client: %s", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
dst.CloseWrite()
|
||||||
|
src.CloseRead()
|
||||||
}
|
}
|
||||||
|
|
||||||
func dialerFromEnv(proxy *ProxyHttpServer) func(network, addr string) (net.Conn, error) {
|
func dialerFromEnv(proxy *ProxyHttpServer) func(network, addr string) (net.Conn, error) {
|
||||||
|
@ -305,8 +341,12 @@ func (proxy *ProxyHttpServer) NewConnectDialToProxy(https_proxy string) func(net
|
||||||
c.Close()
|
c.Close()
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
defer resp.Body.Close()
|
||||||
if resp.StatusCode != 200 {
|
if resp.StatusCode != 200 {
|
||||||
resp, _ := ioutil.ReadAll(resp.Body)
|
resp, err := ioutil.ReadAll(resp.Body)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
c.Close()
|
c.Close()
|
||||||
return nil, errors.New("proxy refused connection" + string(resp))
|
return nil, errors.New("proxy refused connection" + string(resp))
|
||||||
}
|
}
|
||||||
|
@ -339,9 +379,12 @@ func (proxy *ProxyHttpServer) NewConnectDialToProxy(https_proxy string) func(net
|
||||||
c.Close()
|
c.Close()
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
defer resp.Body.Close()
|
||||||
if resp.StatusCode != 200 {
|
if resp.StatusCode != 200 {
|
||||||
body, _ := ioutil.ReadAll(io.LimitReader(resp.Body, 500))
|
body, err := ioutil.ReadAll(io.LimitReader(resp.Body, 500))
|
||||||
resp.Body.Close()
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
c.Close()
|
c.Close()
|
||||||
return nil, errors.New("proxy refused connection" + string(body))
|
return nil, errors.New("proxy refused connection" + string(body))
|
||||||
}
|
}
|
||||||
|
|
|
@ -78,7 +78,7 @@ func removeProxyHeaders(ctx *ProxyCtx, r *http.Request) {
|
||||||
// and would wrap the response body with the relevant reader.
|
// and would wrap the response body with the relevant reader.
|
||||||
r.Header.Del("Accept-Encoding")
|
r.Header.Del("Accept-Encoding")
|
||||||
// curl can add that, see
|
// curl can add that, see
|
||||||
// http://homepage.ntlworld.com/jonathan.deboynepollard/FGA/web-proxy-connection-header.html
|
// https://jdebp.eu./FGA/web-proxy-connection-header.html
|
||||||
r.Header.Del("Proxy-Connection")
|
r.Header.Del("Proxy-Connection")
|
||||||
r.Header.Del("Proxy-Authenticate")
|
r.Header.Del("Proxy-Authenticate")
|
||||||
r.Header.Del("Proxy-Authorization")
|
r.Header.Del("Proxy-Authorization")
|
||||||
|
@ -123,7 +123,7 @@ func (proxy *ProxyHttpServer) ServeHTTP(w http.ResponseWriter, r *http.Request)
|
||||||
}
|
}
|
||||||
origBody := resp.Body
|
origBody := resp.Body
|
||||||
resp = proxy.filterResponse(resp, ctx)
|
resp = proxy.filterResponse(resp, ctx)
|
||||||
|
defer origBody.Close()
|
||||||
ctx.Logf("Copying response to client %v [%d]", resp.Status, resp.StatusCode)
|
ctx.Logf("Copying response to client %v [%d]", resp.Status, resp.StatusCode)
|
||||||
// http.ResponseWriter will take care of filling the correct response length
|
// http.ResponseWriter will take care of filling the correct response length
|
||||||
// Setting it now, might impose wrong value, contradicting the actual new
|
// Setting it now, might impose wrong value, contradicting the actual new
|
||||||
|
|
Loading…
Reference in New Issue