git-lfs/lfshttp/proxy_test.go
brian m. carlson 6dfe9766e0
Add support for SOCKS proxies
Currently, we prepend "http://" to the proxy URL if it's not an HTTP or
HTTPS URL. Unfortunately, that breaks support for SOCKS 5 proxies, which
use URLs that start with "socks5://". Fix this by allowing URL schemes
starting with "socks" in addition to those starting with "http".

Note that this does not introduce any support for socks5h proxies, since
Go does not support them, but we will support them automatically once Go
does.
2019-06-06 13:59:27 +00:00

113 lines
3.0 KiB
Go

package lfshttp
import (
"net/http"
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func TestHttpsProxyFromGitConfig(t *testing.T) {
c, err := NewClient(NewContext(nil, map[string]string{
"HTTPS_PROXY": "https://proxy-from-env:8080",
}, map[string]string{
"http.proxy": "https://proxy-from-git-config:8080",
}))
require.Nil(t, err)
req, err := http.NewRequest("GET", "https://some-host.com:123/foo/bar", nil)
require.Nil(t, err)
proxyURL, err := proxyFromClient(c)(req)
assert.Equal(t, "proxy-from-git-config:8080", proxyURL.Host)
assert.Nil(t, err)
}
func TestProxyForURL(t *testing.T) {
c, err := NewClient(NewContext(nil, nil, map[string]string{
"http.proxy": "https://proxy-for-everyone:8080",
"http.https://some-host.com:123.proxy": "https://proxy-for-some-host:8080",
}))
require.Nil(t, err)
req, err := http.NewRequest("GET", "https://some-host.com:123/foo/bar", nil)
require.Nil(t, err)
proxyURL, err := proxyFromClient(c)(req)
assert.Equal(t, "proxy-for-some-host:8080", proxyURL.Host)
assert.Nil(t, err)
}
func TestHttpProxyFromGitConfig(t *testing.T) {
c, err := NewClient(NewContext(nil, map[string]string{
"HTTPS_PROXY": "https://proxy-from-env:8080",
}, map[string]string{
"http.proxy": "http://proxy-from-git-config:8080",
}))
require.Nil(t, err)
req, err := http.NewRequest("GET", "http://some-host.com:123/foo/bar", nil)
require.Nil(t, err)
proxyURL, err := proxyFromClient(c)(req)
assert.Equal(t, "proxy-from-git-config:8080", proxyURL.Host)
assert.Nil(t, err)
}
func TestProxyFromEnvironment(t *testing.T) {
c, err := NewClient(NewContext(nil, map[string]string{
"HTTPS_PROXY": "https://proxy-from-env:8080",
}, nil))
require.Nil(t, err)
req, err := http.NewRequest("GET", "https://some-host.com:123/foo/bar", nil)
require.Nil(t, err)
proxyURL, err := proxyFromClient(c)(req)
assert.Equal(t, "proxy-from-env:8080", proxyURL.Host)
assert.Nil(t, err)
}
func TestProxyIsNil(t *testing.T) {
c, _ := NewClient(nil)
req, err := http.NewRequest("GET", "http://some-host.com:123/foo/bar", nil)
require.Nil(t, err)
proxyURL, err := proxyFromClient(c)(req)
assert.Nil(t, proxyURL)
assert.Nil(t, err)
}
func TestProxyNoProxy(t *testing.T) {
c, err := NewClient(NewContext(nil, map[string]string{
"NO_PROXY": "some-host",
}, map[string]string{
"http.proxy": "https://proxy-from-git-config:8080",
}))
require.Nil(t, err)
req, err := http.NewRequest("GET", "https://some-host:8080", nil)
require.Nil(t, err)
proxyURL, err := proxyFromClient(c)(req)
assert.Nil(t, proxyURL)
assert.Nil(t, err)
}
func TestSocksProxyFromEnvironment(t *testing.T) {
c, err := NewClient(NewContext(nil, map[string]string{
"HTTPS_PROXY": "socks5://proxy-from-env:3128",
}, nil))
require.Nil(t, err)
req, err := http.NewRequest("GET", "https://some-host.com:123/foo/bar", nil)
require.Nil(t, err)
proxyURL, err := proxyFromClient(c)(req)
assert.Equal(t, "socks5", proxyURL.Scheme)
assert.Equal(t, "proxy-from-env:3128", proxyURL.Host)
assert.Nil(t, err)
}