mirror of
https://github.com/0xJacky/nginx-ui.git
synced 2025-05-11 02:15:48 +02:00
enhance: proxy settings
This commit is contained in:
parent
957d4754f7
commit
deda31a6e1
15 changed files with 351 additions and 261 deletions
|
@ -1,12 +1,11 @@
|
|||
package analytic
|
||||
|
||||
import (
|
||||
"crypto/tls"
|
||||
"encoding/json"
|
||||
"github.com/0xJacky/Nginx-UI/internal/logger"
|
||||
"github.com/0xJacky/Nginx-UI/internal/transport"
|
||||
"github.com/0xJacky/Nginx-UI/internal/upgrader"
|
||||
"github.com/0xJacky/Nginx-UI/model"
|
||||
"github.com/0xJacky/Nginx-UI/settings"
|
||||
"github.com/shirou/gopsutil/v3/load"
|
||||
"github.com/shirou/gopsutil/v3/net"
|
||||
"io"
|
||||
|
@ -82,11 +81,12 @@ func InitNode(env *model.Environment) (n *Node) {
|
|||
return
|
||||
}
|
||||
|
||||
t, err := transport.NewTransport()
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
client := http.Client{
|
||||
Transport: &http.Transport{
|
||||
Proxy: http.ProxyFromEnvironment,
|
||||
TLSClientConfig: &tls.Config{InsecureSkipVerify: settings.ServerSettings.InsecureSkipVerify},
|
||||
},
|
||||
Transport: t,
|
||||
}
|
||||
|
||||
req, err := http.NewRequest("GET", u, nil)
|
||||
|
|
10
internal/cache/cache.go
vendored
10
internal/cache/cache.go
vendored
|
@ -6,11 +6,11 @@ import (
|
|||
"time"
|
||||
)
|
||||
|
||||
var cache *ristretto.Cache
|
||||
var cache *ristretto.Cache[string, any]
|
||||
|
||||
func Init() {
|
||||
var err error
|
||||
cache, err = ristretto.NewCache(&ristretto.Config{
|
||||
cache, err = ristretto.NewCache[string, any](&ristretto.Config[string, any]{
|
||||
NumCounters: 1e7, // number of keys to track frequency of (10M).
|
||||
MaxCost: 1 << 30, // maximum cost of cache (1GB).
|
||||
BufferItems: 64, // number of keys per Get buffer.
|
||||
|
@ -21,15 +21,15 @@ func Init() {
|
|||
}
|
||||
}
|
||||
|
||||
func Set(key interface{}, value interface{}, ttl time.Duration) {
|
||||
func Set(key string, value interface{}, ttl time.Duration) {
|
||||
cache.SetWithTTL(key, value, 0, ttl)
|
||||
cache.Wait()
|
||||
}
|
||||
|
||||
func Get(key interface{}) (value interface{}, ok bool) {
|
||||
func Get(key string) (value interface{}, ok bool) {
|
||||
return cache.Get(key)
|
||||
}
|
||||
|
||||
func Del(key interface{}) {
|
||||
func Del(key string) {
|
||||
cache.Del(key)
|
||||
}
|
||||
|
|
|
@ -1,10 +1,10 @@
|
|||
package cert
|
||||
|
||||
import (
|
||||
"crypto/tls"
|
||||
"github.com/0xJacky/Nginx-UI/internal/cert/dns"
|
||||
"github.com/0xJacky/Nginx-UI/internal/logger"
|
||||
"github.com/0xJacky/Nginx-UI/internal/nginx"
|
||||
"github.com/0xJacky/Nginx-UI/internal/transport"
|
||||
"github.com/0xJacky/Nginx-UI/query"
|
||||
"github.com/0xJacky/Nginx-UI/settings"
|
||||
"github.com/go-acme/lego/v4/challenge/dns01"
|
||||
|
@ -14,7 +14,6 @@ import (
|
|||
dnsproviders "github.com/go-acme/lego/v4/providers/dns"
|
||||
"github.com/pkg/errors"
|
||||
"log"
|
||||
"net/http"
|
||||
"os"
|
||||
"time"
|
||||
)
|
||||
|
@ -63,10 +62,11 @@ func IssueCert(payload *ConfigPayload, logChan chan string, errChan chan error)
|
|||
|
||||
// Skip TLS check
|
||||
if config.HTTPClient != nil {
|
||||
config.HTTPClient.Transport = &http.Transport{
|
||||
Proxy: http.ProxyFromEnvironment,
|
||||
TLSClientConfig: &tls.Config{InsecureSkipVerify: settings.ServerSettings.InsecureSkipVerify},
|
||||
t, err := transport.NewTransport()
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
config.HTTPClient.Transport = t
|
||||
}
|
||||
|
||||
config.Certificate.KeyType = payload.GetKeyType()
|
||||
|
|
|
@ -2,16 +2,15 @@ package cert
|
|||
|
||||
import (
|
||||
"bytes"
|
||||
"crypto/tls"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"github.com/0xJacky/Nginx-UI/internal/helper"
|
||||
"github.com/0xJacky/Nginx-UI/internal/logger"
|
||||
"github.com/0xJacky/Nginx-UI/internal/nginx"
|
||||
"github.com/0xJacky/Nginx-UI/internal/notification"
|
||||
"github.com/0xJacky/Nginx-UI/internal/transport"
|
||||
"github.com/0xJacky/Nginx-UI/model"
|
||||
"github.com/0xJacky/Nginx-UI/query"
|
||||
"github.com/0xJacky/Nginx-UI/settings"
|
||||
"github.com/go-acme/lego/v4/certcrypto"
|
||||
"io"
|
||||
"net/http"
|
||||
|
@ -88,11 +87,12 @@ type SyncNotificationPayload struct {
|
|||
}
|
||||
|
||||
func deploy(env *model.Environment, c *model.Cert, payloadBytes []byte) (err error) {
|
||||
t, err := transport.NewTransport()
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
client := http.Client{
|
||||
Transport: &http.Transport{
|
||||
Proxy: http.ProxyFromEnvironment,
|
||||
TLSClientConfig: &tls.Config{InsecureSkipVerify: settings.ServerSettings.InsecureSkipVerify},
|
||||
},
|
||||
Transport: t,
|
||||
}
|
||||
url, err := env.GetUrl("/api/cert_sync")
|
||||
if err != nil {
|
||||
|
|
|
@ -9,6 +9,7 @@ import (
|
|||
"github.com/0xJacky/Nginx-UI/internal/logger"
|
||||
"github.com/0xJacky/Nginx-UI/internal/nginx"
|
||||
"github.com/0xJacky/Nginx-UI/internal/notification"
|
||||
"github.com/0xJacky/Nginx-UI/internal/transport"
|
||||
"github.com/0xJacky/Nginx-UI/model"
|
||||
"github.com/0xJacky/Nginx-UI/query"
|
||||
"github.com/0xJacky/Nginx-UI/settings"
|
||||
|
@ -122,11 +123,12 @@ type SyncNotificationPayload struct {
|
|||
}
|
||||
|
||||
func (p *SyncConfigPayload) deploy(env *model.Environment, c *model.Config, payloadBytes []byte) (err error) {
|
||||
t, err := transport.NewTransport()
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
client := http.Client{
|
||||
Transport: &http.Transport{
|
||||
Proxy: http.ProxyFromEnvironment,
|
||||
TLSClientConfig: &tls.Config{InsecureSkipVerify: settings.ServerSettings.InsecureSkipVerify},
|
||||
},
|
||||
Transport: t,
|
||||
}
|
||||
url, err := env.GetUrl("/api/config")
|
||||
if err != nil {
|
||||
|
|
|
@ -1,10 +1,9 @@
|
|||
package middleware
|
||||
|
||||
import (
|
||||
"crypto/tls"
|
||||
"github.com/0xJacky/Nginx-UI/internal/logger"
|
||||
"github.com/0xJacky/Nginx-UI/internal/transport"
|
||||
"github.com/0xJacky/Nginx-UI/query"
|
||||
"github.com/0xJacky/Nginx-UI/settings"
|
||||
"github.com/gin-gonic/gin"
|
||||
"github.com/spf13/cast"
|
||||
"io"
|
||||
|
@ -57,11 +56,18 @@ func Proxy() gin.HandlerFunc {
|
|||
}
|
||||
|
||||
logger.Debug("Proxy request", proxyUrl.String())
|
||||
|
||||
t, err := transport.NewTransport()
|
||||
if err != nil {
|
||||
logger.Error(err)
|
||||
c.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{
|
||||
"message": err.Error(),
|
||||
})
|
||||
return
|
||||
}
|
||||
|
||||
client := http.Client{
|
||||
Transport: &http.Transport{
|
||||
Proxy: http.ProxyFromEnvironment,
|
||||
TLSClientConfig: &tls.Config{InsecureSkipVerify: settings.ServerSettings.InsecureSkipVerify},
|
||||
},
|
||||
Transport: t,
|
||||
}
|
||||
|
||||
req, err := http.NewRequest(c.Request.Method, proxyUrl.String(), c.Request.Body)
|
||||
|
|
44
internal/transport/transport.go
Normal file
44
internal/transport/transport.go
Normal file
|
@ -0,0 +1,44 @@
|
|||
package transport
|
||||
|
||||
import (
|
||||
"crypto/tls"
|
||||
"github.com/0xJacky/Nginx-UI/settings"
|
||||
"net/http"
|
||||
"net/url"
|
||||
)
|
||||
|
||||
// NewTransport creates a new http.Transport with the provided options.
|
||||
func NewTransport(options ...func(transport *http.Transport) error) (t *http.Transport, err error) {
|
||||
t = &http.Transport{
|
||||
Proxy: http.ProxyFromEnvironment,
|
||||
TLSClientConfig: &tls.Config{InsecureSkipVerify: settings.ServerSettings.InsecureSkipVerify},
|
||||
}
|
||||
|
||||
for _, option := range options {
|
||||
if err := option(t); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
// WithProxy returns a function that sets the proxy of the http.Transport to the provided proxy URL.
|
||||
func WithProxy(proxyUrl string) func(transport *http.Transport) error {
|
||||
if proxyUrl == "" {
|
||||
return func(transport *http.Transport) error {
|
||||
return nil
|
||||
}
|
||||
}
|
||||
proxy, err := url.Parse(proxyUrl)
|
||||
if err != nil {
|
||||
return func(transport *http.Transport) error {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
return func(transport *http.Transport) error {
|
||||
transport.Proxy = http.ProxyURL(proxy)
|
||||
return nil
|
||||
}
|
||||
}
|
42
internal/transport/transport_test.go
Normal file
42
internal/transport/transport_test.go
Normal file
|
@ -0,0 +1,42 @@
|
|||
package transport
|
||||
|
||||
import (
|
||||
"net/http"
|
||||
"net/url"
|
||||
"testing"
|
||||
|
||||
"github.com/0xJacky/Nginx-UI/settings"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
func TestCreatesTransportWithDefaultSettings(t *testing.T) {
|
||||
transport, err := NewTransport()
|
||||
require.NoError(t, err)
|
||||
assert.NotNil(t, transport)
|
||||
assert.ObjectsAreEqual(http.ProxyFromEnvironment, transport.Proxy)
|
||||
assert.Equal(t, settings.ServerSettings.InsecureSkipVerify, transport.TLSClientConfig.InsecureSkipVerify)
|
||||
}
|
||||
|
||||
func TestCreatesTransportWithCustomProxy(t *testing.T) {
|
||||
proxyUrl := "https://proxy.example.com"
|
||||
transport, err := NewTransport(WithProxy(proxyUrl))
|
||||
require.NoError(t, err)
|
||||
assert.NotNil(t, transport)
|
||||
parsedProxy, _ := url.Parse(proxyUrl)
|
||||
assert.ObjectsAreEqual(http.ProxyURL(parsedProxy), transport.Proxy)
|
||||
}
|
||||
|
||||
func TestCreatesTransportWithInvalidProxyUrl(t *testing.T) {
|
||||
invalidProxyUrl := "https://[::1]:namedport"
|
||||
transport, err := NewTransport(WithProxy(invalidProxyUrl))
|
||||
assert.Error(t, err)
|
||||
assert.Nil(t, transport)
|
||||
}
|
||||
|
||||
func TestCreatesTransportWithEmptyProxyUrl(t *testing.T) {
|
||||
transport, err := NewTransport(WithProxy(""))
|
||||
require.NoError(t, err)
|
||||
assert.NotNil(t, transport)
|
||||
assert.ObjectsAreEqual(http.ProxyFromEnvironment, transport.Proxy)
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue