Compare commits

...

20 Commits

Author SHA1 Message Date
fatedier
1ea1530b36 Merge pull request #2058 from fatedier/dev
bump version to v0.34.2
2020-11-06 14:50:50 +08:00
fatedier
7f7305fa03 update version 2020-11-06 14:39:04 +08:00
yuyulei
644a0cfdb6 Update ReverseProxy code from official golang repo (#2051)
Fix #1192
2020-11-05 16:34:17 +08:00
Chirag Sukhala
3c2e2bcea5 Update frpc_full.ini (#2023)
Added authenticate_heartbeats and authenticate_new_work_conns
2020-10-08 14:25:03 +08:00
fatedier
e0c45a1aca Merge pull request #2018 from fatedier/dev
bump version to v0.34.1
2020-09-30 15:13:08 +08:00
fatedier
e52dfc4a5c bump version to v0.34.1 2020-09-30 14:40:08 +08:00
lonwern
cc003a2570 reduce docker image size (#2014) 2020-09-30 11:05:34 +08:00
lonwern
0f8040b875 fix create tls work connection (#2013) 2020-09-29 15:44:52 +08:00
harmy
ef5ae3e598 fix: a reconnected proxy will disappear from dashboard after 7 days (#2008) 2020-09-25 16:10:20 +08:00
fatedier
3acf1bb6e9 update stale workflow 2020-09-25 15:15:34 +08:00
fatedier
1089eb9d22 update stale workflow 2020-09-25 15:00:41 +08:00
vesta
edf9596ca8 ci: add close stale (#2001) 2020-09-25 14:40:01 +08:00
fatedier
26e54b901f dockerfile: remove ca-certificates 2020-09-23 16:38:44 +08:00
fatedier
008933f304 typo fix 2020-09-23 15:53:08 +08:00
fatedier
317f901c1c typo 2020-09-23 14:40:22 +08:00
fatedier
cd5314466c update workflows build-and-push-image 2020-09-23 14:20:46 +08:00
fatedier
3fbdea0f6b rename models to pkg (#2005) 2020-09-23 13:49:14 +08:00
vesta
710ecf44f5 feat: support ntlm proxy set in http_proxy env (#2002) 2020-09-23 12:05:05 +08:00
yuyulei
04dafd7ff0 Remove comments (#2004) 2020-09-23 11:57:04 +08:00
yuyulei
c6aa74a2bb Add action to build and push image to dockerhub&github packages (#1998) 2020-09-23 11:05:50 +08:00
118 changed files with 474 additions and 248 deletions

View File

@@ -0,0 +1,115 @@
name: Build Image and Publish to Dockerhub & GPR
on:
release:
types: [ created ]
workflow_dispatch:
inputs:
tag:
description: 'Image tag'
required: true
default: 'test'
jobs:
binary:
name: Build Golang project
runs-on: ubuntu-latest
steps:
-
name: Set up Go 1.x
uses: actions/setup-go@v2
with:
go-version: 1.15
-
run: go version
-
name: Check out code into the Go module directory
uses: actions/checkout@v2
-
name: Build
run: make build
-
name: Archive artifacts for frpc
uses: actions/upload-artifact@v1
with:
name: frpc
path: bin/frpc
-
name: Archive artifacts for frps
uses: actions/upload-artifact@v1
with:
name: frps
path: bin/frps
image:
name: Build Image from Dockerfile and binaries
runs-on: ubuntu-latest
needs: binary
steps:
# environment
-
name: Checkout
uses: actions/checkout@v2
with:
fetch-depth: '0'
-
name: Set up QEMU
uses: docker/setup-qemu-action@v1
-
name: Set up Docker Buildx
uses: docker/setup-buildx-action@v1
# download binaries of frpc and frps
-
name: Download binary of frpc
uses: actions/download-artifact@v2
with:
name: frpc
path: bin/frpc
-
name: Download binary of frps
uses: actions/download-artifact@v2
with:
name: frps
path: bin/frps
# get image tag name
-
name: Get Image Tag Name
run: |
if [ x${{ github.event.inputs.tag }} == x"" ]; then
echo ::set-env name=TAG_NAME::${GITHUB_REF#refs/*/}
else
echo ::set-env name=TAG_NAME::${{ github.event.inputs.tag }}
fi
# prepare image tags
-
name: Prepare Image Tags
run: |
echo ::set-env name=DOCKERFILE_FRPC_PATH::dockerfiles/Dockerfile-for-frpc
echo ::set-env name=DOCKERFILE_FRPS_PATH::dockerfiles/Dockerfile-for-frps
echo ::set-env name=TAG_FRPC::fatedier/frpc:$TAG_NAME
echo ::set-env name=TAG_FRPS::fatedier/frps:$TAG_NAME
echo ::set-env name=TAG_FRPC_GPR::ghcr.io/fatedier/frpc:$TAG_NAME
echo ::set-env name=TAG_FRPS_GPR::ghcr.io/fatedier/frps:$TAG_NAME
# build images
-
name: Build Images
run: |
# for Docker hub
docker build --file $DOCKERFILE_FRPC_PATH --tag $TAG_FRPC .
docker build --file $DOCKERFILE_FRPS_PATH --tag $TAG_FRPS .
# for GPR
docker build --file $DOCKERFILE_FRPC_PATH --tag $TAG_FRPC_GPR .
docker build --file $DOCKERFILE_FRPS_PATH --tag $TAG_FRPS_GPR .
# push to dockerhub
-
name: Publish to Dockerhub
run: |
echo ${{ secrets.DOCKERHUB_PASSWORD }} | docker login --username ${{ secrets.DOCKERHUB_USERNAME }} --password-stdin
docker push $TAG_FRPC
docker push $TAG_FRPS
# push to gpr
-
name: Publish to GPR
run: |
echo ${{ secrets.GPR_TOKEN }} | docker login ghcr.io --username ${{ github.repository_owner }} --password-stdin
docker push $TAG_FRPC_GPR
docker push $TAG_FRPS_GPR

26
.github/workflows/stale.yml vendored Normal file
View File

@@ -0,0 +1,26 @@
name: "Close stale issues"
on:
schedule:
- cron: "20 0 * * *"
workflow_dispatch:
inputs:
debug-only:
description: 'In debug mod'
required: false
default: 'false'
jobs:
stale:
runs-on: ubuntu-latest
steps:
- uses: actions/stale@v3
with:
repo-token: ${{ secrets.GITHUB_TOKEN }}
stale-issue-message: 'Issues go stale after 45d of inactivity. Stale issues rot after an additional 10d of inactivity and eventually close.'
stale-pr-message: 'Issues go stale after 45d of inactivity. Stale issues rot after an additional 10d of inactivity and eventually close.'
stale-issue-label: 'lifecycle/stale'
exempt-issue-labels: 'bug,doc,enhancement,future,proposal,question,testing,todo,easy,help wanted,assigned'
stale-pr-label: 'lifecycle/stale'
exempt-pr-labels: 'bug,doc,enhancement,future,proposal,question,testing,todo,easy,help wanted,assigned'
days-before-stale: 45
days-before-close: 10
debug-only: ${{ github.event.inputs.debug-only }}

View File

@@ -1,5 +1,6 @@
export PATH := $(GOPATH)/bin:$(PATH) export PATH := $(GOPATH)/bin:$(PATH)
export GO111MODULE=on export GO111MODULE=on
LDFLAGS := -s -w
all: fmt build all: fmt build
@@ -19,20 +20,19 @@ fmt:
go fmt ./... go fmt ./...
frps: frps:
go build -o bin/frps ./cmd/frps env CGO_ENABLED=0 go build -ldflags "$(LDFLAGS)" -o bin/frps ./cmd/frps
frpc: frpc:
go build -o bin/frpc ./cmd/frpc env CGO_ENABLED=0 go build -ldflags "$(LDFLAGS)" -o bin/frpc ./cmd/frpc
test: gotest test: gotest
gotest: gotest:
go test -v --cover ./assets/... go test -v --cover ./assets/...
go test -v --cover ./client/...
go test -v --cover ./cmd/... go test -v --cover ./cmd/...
go test -v --cover ./models/... go test -v --cover ./client/...
go test -v --cover ./server/... go test -v --cover ./server/...
go test -v --cover ./utils/... go test -v --cover ./pkg/...
ci: ci:
go test -count=1 -p=1 -v ./tests/... go test -count=1 -p=1 -v ./tests/...

View File

@@ -21,7 +21,7 @@ import (
"time" "time"
"github.com/fatedier/frp/assets" "github.com/fatedier/frp/assets"
frpNet "github.com/fatedier/frp/utils/net" frpNet "github.com/fatedier/frp/pkg/util/net"
"github.com/gorilla/mux" "github.com/gorilla/mux"
) )

View File

@@ -23,8 +23,8 @@ import (
"strings" "strings"
"github.com/fatedier/frp/client/proxy" "github.com/fatedier/frp/client/proxy"
"github.com/fatedier/frp/models/config" "github.com/fatedier/frp/pkg/config"
"github.com/fatedier/frp/utils/log" "github.com/fatedier/frp/pkg/util/log"
) )
type GeneralResponse struct { type GeneralResponse struct {

View File

@@ -25,12 +25,12 @@ import (
"time" "time"
"github.com/fatedier/frp/client/proxy" "github.com/fatedier/frp/client/proxy"
"github.com/fatedier/frp/models/auth" "github.com/fatedier/frp/pkg/auth"
"github.com/fatedier/frp/models/config" "github.com/fatedier/frp/pkg/config"
"github.com/fatedier/frp/models/msg" "github.com/fatedier/frp/pkg/msg"
"github.com/fatedier/frp/models/transport" "github.com/fatedier/frp/pkg/transport"
frpNet "github.com/fatedier/frp/utils/net" frpNet "github.com/fatedier/frp/pkg/util/net"
"github.com/fatedier/frp/utils/xlog" "github.com/fatedier/frp/pkg/util/xlog"
"github.com/fatedier/golib/control/shutdown" "github.com/fatedier/golib/control/shutdown"
"github.com/fatedier/golib/crypto" "github.com/fatedier/golib/crypto"
@@ -211,10 +211,11 @@ func (ctl *Control) connectServer() (conn net.Conn, err error) {
var tlsConfig *tls.Config var tlsConfig *tls.Config
if ctl.clientCfg.TLSEnable { if ctl.clientCfg.TLSEnable {
tlsConfig, err = transport.NewServerTLSConfig( tlsConfig, err = transport.NewClientTLSConfig(
ctl.clientCfg.TLSCertFile, ctl.clientCfg.TLSCertFile,
ctl.clientCfg.TLSKeyFile, ctl.clientCfg.TLSKeyFile,
ctl.clientCfg.TLSTrustedCaFile) ctl.clientCfg.TLSTrustedCaFile,
ctl.clientCfg.ServerAddr)
if err != nil { if err != nil {
xl.Warn("fail to build tls configuration when connecting to server, err: %v", err) xl.Warn("fail to build tls configuration when connecting to server, err: %v", err)

View File

@@ -3,7 +3,7 @@ package event
import ( import (
"errors" "errors"
"github.com/fatedier/frp/models/msg" "github.com/fatedier/frp/pkg/msg"
) )
type Type int type Type int

View File

@@ -24,7 +24,7 @@ import (
"net/http" "net/http"
"time" "time"
"github.com/fatedier/frp/utils/xlog" "github.com/fatedier/frp/pkg/util/xlog"
) )
var ( var (

View File

@@ -26,13 +26,13 @@ import (
"sync" "sync"
"time" "time"
"github.com/fatedier/frp/models/config" "github.com/fatedier/frp/pkg/config"
"github.com/fatedier/frp/models/msg" "github.com/fatedier/frp/pkg/msg"
plugin "github.com/fatedier/frp/models/plugin/client" plugin "github.com/fatedier/frp/pkg/plugin/client"
"github.com/fatedier/frp/models/proto/udp" "github.com/fatedier/frp/pkg/proto/udp"
"github.com/fatedier/frp/utils/limit" "github.com/fatedier/frp/pkg/util/limit"
frpNet "github.com/fatedier/frp/utils/net" frpNet "github.com/fatedier/frp/pkg/util/net"
"github.com/fatedier/frp/utils/xlog" "github.com/fatedier/frp/pkg/util/xlog"
"github.com/fatedier/golib/errors" "github.com/fatedier/golib/errors"
frpIo "github.com/fatedier/golib/io" frpIo "github.com/fatedier/golib/io"

View File

@@ -7,9 +7,9 @@ import (
"sync" "sync"
"github.com/fatedier/frp/client/event" "github.com/fatedier/frp/client/event"
"github.com/fatedier/frp/models/config" "github.com/fatedier/frp/pkg/config"
"github.com/fatedier/frp/models/msg" "github.com/fatedier/frp/pkg/msg"
"github.com/fatedier/frp/utils/xlog" "github.com/fatedier/frp/pkg/util/xlog"
"github.com/fatedier/golib/errors" "github.com/fatedier/golib/errors"
) )

View File

@@ -10,9 +10,9 @@ import (
"github.com/fatedier/frp/client/event" "github.com/fatedier/frp/client/event"
"github.com/fatedier/frp/client/health" "github.com/fatedier/frp/client/health"
"github.com/fatedier/frp/models/config" "github.com/fatedier/frp/pkg/config"
"github.com/fatedier/frp/models/msg" "github.com/fatedier/frp/pkg/msg"
"github.com/fatedier/frp/utils/xlog" "github.com/fatedier/frp/pkg/util/xlog"
"github.com/fatedier/golib/errors" "github.com/fatedier/golib/errors"
) )

View File

@@ -18,7 +18,6 @@ import (
"context" "context"
"crypto/tls" "crypto/tls"
"fmt" "fmt"
"github.com/fatedier/frp/models/transport"
"io/ioutil" "io/ioutil"
"net" "net"
"runtime" "runtime"
@@ -27,13 +26,14 @@ import (
"time" "time"
"github.com/fatedier/frp/assets" "github.com/fatedier/frp/assets"
"github.com/fatedier/frp/models/auth" "github.com/fatedier/frp/pkg/auth"
"github.com/fatedier/frp/models/config" "github.com/fatedier/frp/pkg/config"
"github.com/fatedier/frp/models/msg" "github.com/fatedier/frp/pkg/msg"
"github.com/fatedier/frp/utils/log" "github.com/fatedier/frp/pkg/transport"
frpNet "github.com/fatedier/frp/utils/net" "github.com/fatedier/frp/pkg/util/log"
"github.com/fatedier/frp/utils/version" frpNet "github.com/fatedier/frp/pkg/util/net"
"github.com/fatedier/frp/utils/xlog" "github.com/fatedier/frp/pkg/util/version"
"github.com/fatedier/frp/pkg/util/xlog"
fmux "github.com/hashicorp/yamux" fmux "github.com/hashicorp/yamux"
) )

View File

@@ -24,12 +24,12 @@ import (
"sync" "sync"
"time" "time"
"github.com/fatedier/frp/models/config" "github.com/fatedier/frp/pkg/config"
"github.com/fatedier/frp/models/msg" "github.com/fatedier/frp/pkg/msg"
"github.com/fatedier/frp/models/proto/udp" "github.com/fatedier/frp/pkg/proto/udp"
frpNet "github.com/fatedier/frp/utils/net" frpNet "github.com/fatedier/frp/pkg/util/net"
"github.com/fatedier/frp/utils/util" "github.com/fatedier/frp/pkg/util/util"
"github.com/fatedier/frp/utils/xlog" "github.com/fatedier/frp/pkg/util/xlog"
"github.com/fatedier/golib/errors" "github.com/fatedier/golib/errors"
frpIo "github.com/fatedier/golib/io" frpIo "github.com/fatedier/golib/io"

View File

@@ -19,8 +19,8 @@ import (
"sync" "sync"
"time" "time"
"github.com/fatedier/frp/models/config" "github.com/fatedier/frp/pkg/config"
"github.com/fatedier/frp/utils/xlog" "github.com/fatedier/frp/pkg/util/xlog"
) )
type VisitorManager struct { type VisitorManager struct {

View File

@@ -19,10 +19,10 @@ import (
"os" "os"
"strings" "strings"
"github.com/spf13/cobra" "github.com/fatedier/frp/pkg/config"
"github.com/fatedier/frp/pkg/consts"
"github.com/fatedier/frp/models/config" "github.com/spf13/cobra"
"github.com/fatedier/frp/models/consts"
) )
func init() { func init() {

View File

@@ -21,8 +21,8 @@ import (
"github.com/spf13/cobra" "github.com/spf13/cobra"
"github.com/fatedier/frp/models/config" "github.com/fatedier/frp/pkg/config"
"github.com/fatedier/frp/models/consts" "github.com/fatedier/frp/pkg/consts"
) )
func init() { func init() {

View File

@@ -22,9 +22,9 @@ import (
"os" "os"
"strings" "strings"
"github.com/spf13/cobra" "github.com/fatedier/frp/pkg/config"
"github.com/fatedier/frp/models/config" "github.com/spf13/cobra"
) )
func init() { func init() {

View File

@@ -25,13 +25,13 @@ import (
"syscall" "syscall"
"time" "time"
"github.com/spf13/cobra"
"github.com/fatedier/frp/client" "github.com/fatedier/frp/client"
"github.com/fatedier/frp/models/auth" "github.com/fatedier/frp/pkg/auth"
"github.com/fatedier/frp/models/config" "github.com/fatedier/frp/pkg/config"
"github.com/fatedier/frp/utils/log" "github.com/fatedier/frp/pkg/util/log"
"github.com/fatedier/frp/utils/version" "github.com/fatedier/frp/pkg/util/version"
"github.com/spf13/cobra"
) )
const ( const (

View File

@@ -23,11 +23,11 @@ import (
"os" "os"
"strings" "strings"
"github.com/fatedier/frp/client"
"github.com/fatedier/frp/pkg/config"
"github.com/rodaine/table" "github.com/rodaine/table"
"github.com/spf13/cobra" "github.com/spf13/cobra"
"github.com/fatedier/frp/client"
"github.com/fatedier/frp/models/config"
) )
func init() { func init() {

View File

@@ -18,10 +18,10 @@ import (
"fmt" "fmt"
"os" "os"
"github.com/spf13/cobra" "github.com/fatedier/frp/pkg/config"
"github.com/fatedier/frp/pkg/consts"
"github.com/fatedier/frp/models/config" "github.com/spf13/cobra"
"github.com/fatedier/frp/models/consts"
) )
func init() { func init() {

View File

@@ -18,10 +18,10 @@ import (
"fmt" "fmt"
"os" "os"
"github.com/spf13/cobra" "github.com/fatedier/frp/pkg/config"
"github.com/fatedier/frp/pkg/consts"
"github.com/fatedier/frp/models/config" "github.com/spf13/cobra"
"github.com/fatedier/frp/models/consts"
) )
func init() { func init() {

View File

@@ -20,8 +20,8 @@ import (
"github.com/spf13/cobra" "github.com/spf13/cobra"
"github.com/fatedier/frp/models/config" "github.com/fatedier/frp/pkg/config"
"github.com/fatedier/frp/models/consts" "github.com/fatedier/frp/pkg/consts"
) )
func init() { func init() {

View File

@@ -21,8 +21,8 @@ import (
"github.com/spf13/cobra" "github.com/spf13/cobra"
"github.com/fatedier/frp/models/config" "github.com/fatedier/frp/pkg/config"
"github.com/fatedier/frp/models/consts" "github.com/fatedier/frp/pkg/consts"
) )
func init() { func init() {

View File

@@ -18,10 +18,10 @@ import (
"fmt" "fmt"
"os" "os"
"github.com/spf13/cobra" "github.com/fatedier/frp/pkg/config"
"github.com/fatedier/frp/pkg/consts"
"github.com/fatedier/frp/models/config" "github.com/spf13/cobra"
"github.com/fatedier/frp/models/consts"
) )
func init() { func init() {

View File

@@ -18,10 +18,10 @@ import (
"fmt" "fmt"
"os" "os"
"github.com/spf13/cobra" "github.com/fatedier/frp/pkg/config"
"github.com/fatedier/frp/pkg/consts"
"github.com/fatedier/frp/models/config" "github.com/spf13/cobra"
"github.com/fatedier/frp/models/consts"
) )
func init() { func init() {

View File

@@ -21,7 +21,7 @@ import (
"github.com/fatedier/golib/crypto" "github.com/fatedier/golib/crypto"
_ "github.com/fatedier/frp/assets/frps/statik" _ "github.com/fatedier/frp/assets/frps/statik"
_ "github.com/fatedier/frp/models/metrics" _ "github.com/fatedier/frp/pkg/metrics"
) )
func main() { func main() {

View File

@@ -18,14 +18,14 @@ import (
"fmt" "fmt"
"os" "os"
"github.com/spf13/cobra" "github.com/fatedier/frp/pkg/auth"
"github.com/fatedier/frp/pkg/config"
"github.com/fatedier/frp/models/auth" "github.com/fatedier/frp/pkg/util/log"
"github.com/fatedier/frp/models/config" "github.com/fatedier/frp/pkg/util/util"
"github.com/fatedier/frp/pkg/util/version"
"github.com/fatedier/frp/server" "github.com/fatedier/frp/server"
"github.com/fatedier/frp/utils/log"
"github.com/fatedier/frp/utils/util" "github.com/spf13/cobra"
"github.com/fatedier/frp/utils/version"
) )
const ( const (

View File

@@ -5,10 +5,11 @@
server_addr = 0.0.0.0 server_addr = 0.0.0.0
server_port = 7000 server_port = 7000
# if you want to connect frps by http proxy or socks5 proxy, you can set http_proxy here or in global environment variables # if you want to connect frps by http proxy or socks5 proxy or ntlm proxy, you can set http_proxy here or in global environment variables
# it only works when protocol is tcp # it only works when protocol is tcp
# http_proxy = http://user:passwd@192.168.1.128:8080 # http_proxy = http://user:passwd@192.168.1.128:8080
# http_proxy = socks5://user:passwd@192.168.1.128:1080 # http_proxy = socks5://user:passwd@192.168.1.128:1080
# http_proxy = ntlm://user:passwd@192.168.1.128:2080
# console or real logFile path like ./frpc.log # console or real logFile path like ./frpc.log
log_file = ./frpc.log log_file = ./frpc.log
@@ -21,7 +22,14 @@ log_max_days = 3
# disable log colors when log_file is console, default is false # disable log colors when log_file is console, default is false
disable_log_color = false disable_log_color = false
# for authentication # for authentication, should be same as your frps.ini
# AuthenticateHeartBeats specifies whether to include authentication token in heartbeats sent to frps. By default, this value is false.
authenticate_heartbeats = false
# AuthenticateNewWorkConns specifies whether to include authentication token in new work connections sent to frps. By default, this value is false.
authenticate_new_work_conns = false
# auth token
token = 12345678 token = 12345678
# set admin address for control frpc's action by http api such as reload # set admin address for control frpc's action by http api such as reload
@@ -46,7 +54,7 @@ user = your_name
login_fail_exit = true login_fail_exit = true
# communication protocol used to connect to server # communication protocol used to connect to server
# now it supports tcp and kcp and websocket, default is tcp # now it supports tcp, kcp and websocket, default is tcp
protocol = tcp protocol = tcp
# if tls_enable is true, frpc will connect frps by tls # if tls_enable is true, frpc will connect frps by tls

View File

@@ -0,0 +1,14 @@
FROM alpine:3.12.0 AS temp
COPY bin/frpc /tmp
RUN chmod -R 777 /tmp/frpc
FROM alpine:3.12.0
WORKDIR /app
COPY --from=temp /tmp/frpc /usr/bin
ENTRYPOINT ["/usr/bin/frpc"]

View File

@@ -0,0 +1,14 @@
FROM alpine:3.12.0 AS temp
COPY bin/frps /tmp
RUN chmod -R 777 /tmp/frps
FROM alpine:3.12.0
WORKDIR /app
COPY --from=temp /tmp/frps /usr/bin
ENTRYPOINT ["/usr/bin/frps"]

3
go.mod
View File

@@ -6,9 +6,8 @@ require (
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5
github.com/coreos/go-oidc v2.2.1+incompatible github.com/coreos/go-oidc v2.2.1+incompatible
github.com/fatedier/beego v0.0.0-20171024143340-6c6a4f5bd5eb github.com/fatedier/beego v0.0.0-20171024143340-6c6a4f5bd5eb
github.com/fatedier/golib v0.0.0-20181107124048-ff8cd814b049 github.com/fatedier/golib v0.1.1-0.20200901083111-1f870741e185
github.com/fatedier/kcp-go v2.0.4-0.20190803094908-fe8645b0a904+incompatible github.com/fatedier/kcp-go v2.0.4-0.20190803094908-fe8645b0a904+incompatible
github.com/golang/snappy v0.0.0-20170215233205-553a64147049 // indirect
github.com/google/uuid v1.1.1 github.com/google/uuid v1.1.1
github.com/gorilla/mux v1.7.3 github.com/gorilla/mux v1.7.3
github.com/gorilla/websocket v1.4.0 github.com/gorilla/websocket v1.4.0

12
go.sum
View File

@@ -1,4 +1,6 @@
cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
github.com/Azure/go-ntlmssp v0.0.0-20200615164410-66371956d46c h1:/IBSNwUN8+eKzUzbJPqhK839ygXJ82sde8x3ogr6R28=
github.com/Azure/go-ntlmssp v0.0.0-20200615164410-66371956d46c/go.mod h1:chxPXzSsl7ZWRAuOIE23GDNzjWuZquvFlgA8xmpunjU=
github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ=
github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=
github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE=
@@ -25,8 +27,8 @@ github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb
github.com/evanphx/json-patch v4.2.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/evanphx/json-patch v4.2.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk=
github.com/fatedier/beego v0.0.0-20171024143340-6c6a4f5bd5eb h1:wCrNShQidLmvVWn/0PikGmpdP0vtQmnvyRg3ZBEhczw= github.com/fatedier/beego v0.0.0-20171024143340-6c6a4f5bd5eb h1:wCrNShQidLmvVWn/0PikGmpdP0vtQmnvyRg3ZBEhczw=
github.com/fatedier/beego v0.0.0-20171024143340-6c6a4f5bd5eb/go.mod h1:wx3gB6dbIfBRcucp94PI9Bt3I0F2c/MyNEWuhzpWiwk= github.com/fatedier/beego v0.0.0-20171024143340-6c6a4f5bd5eb/go.mod h1:wx3gB6dbIfBRcucp94PI9Bt3I0F2c/MyNEWuhzpWiwk=
github.com/fatedier/golib v0.0.0-20181107124048-ff8cd814b049 h1:teH578mf2ii42NHhIp3PhgvjU5bv+NFMq9fSQR8NaG8= github.com/fatedier/golib v0.1.1-0.20200901083111-1f870741e185 h1:2p4W5xYizIYwhiGQgeHOQcRD2O84j0tjD40P6gUCRrk=
github.com/fatedier/golib v0.0.0-20181107124048-ff8cd814b049/go.mod h1:DqIrnl0rp3Zybg9zbJmozTy1n8fYJoX+QoAj9slIkKM= github.com/fatedier/golib v0.1.1-0.20200901083111-1f870741e185/go.mod h1:MUs+IH/MGJNz5Cj2JVJBPZBKw2exON7LzO3HrJHmGiQ=
github.com/fatedier/kcp-go v2.0.4-0.20190803094908-fe8645b0a904+incompatible h1:ssXat9YXFvigNge/IkkZvFMn8yeYKFX+uI6wn2mLJ74= github.com/fatedier/kcp-go v2.0.4-0.20190803094908-fe8645b0a904+incompatible h1:ssXat9YXFvigNge/IkkZvFMn8yeYKFX+uI6wn2mLJ74=
github.com/fatedier/kcp-go v2.0.4-0.20190803094908-fe8645b0a904+incompatible/go.mod h1:YpCOaxj7vvMThhIQ9AfTOPW2sfztQR5WDfs7AflSy4s= github.com/fatedier/kcp-go v2.0.4-0.20190803094908-fe8645b0a904+incompatible/go.mod h1:YpCOaxj7vvMThhIQ9AfTOPW2sfztQR5WDfs7AflSy4s=
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
@@ -58,8 +60,8 @@ github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:W
github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
github.com/golang/protobuf v1.4.2 h1:+Z5KGCizgyZCbGh1KZqA0fcLLkwbsjIzS4aV2v7wJX0= github.com/golang/protobuf v1.4.2 h1:+Z5KGCizgyZCbGh1KZqA0fcLLkwbsjIzS4aV2v7wJX0=
github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
github.com/golang/snappy v0.0.0-20170215233205-553a64147049 h1:K9KHZbXKpGydfDN0aZrsoHpLJlZsBrGMFWbgLDGnPZk= github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4=
github.com/golang/snappy v0.0.0-20170215233205-553a64147049/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
github.com/google/go-cmp v0.4.0 h1:xsAVV57WRhGj6kEIi8ReJzQlHHqcBYCElAvkovg3B/4= github.com/google/go-cmp v0.4.0 h1:xsAVV57WRhGj6kEIi8ReJzQlHHqcBYCElAvkovg3B/4=
@@ -174,6 +176,7 @@ github.com/vaughan0/go-ini v0.0.0-20130923145212-a98ad7ee00ec/go.mod h1:owBmyHYM
github.com/xtaci/lossyconn v0.0.0-20190602105132-8df528c0c9ae h1:J0GxkO96kL4WF+AIT3M4mfUVinOCPgf2uUWYFUzN0sM= github.com/xtaci/lossyconn v0.0.0-20190602105132-8df528c0c9ae h1:J0GxkO96kL4WF+AIT3M4mfUVinOCPgf2uUWYFUzN0sM=
github.com/xtaci/lossyconn v0.0.0-20190602105132-8df528c0c9ae/go.mod h1:gXtu8J62kEgmN++bm9BVICuT/e8yiLI2KFobd/TRFsE= github.com/xtaci/lossyconn v0.0.0-20190602105132-8df528c0c9ae/go.mod h1:gXtu8J62kEgmN++bm9BVICuT/e8yiLI2KFobd/TRFsE=
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
golang.org/x/crypto v0.0.0-20190228161510-8dd112bcdc25/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2 h1:VklqNMn3ovrHsnt90PveolxSbWFaJdECFbxSq0Mqo2M= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2 h1:VklqNMn3ovrHsnt90PveolxSbWFaJdECFbxSq0Mqo2M=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
@@ -181,6 +184,7 @@ golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73r
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190228165749-92fc7df08ae7/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7 h1:AeiKBIuRw3UomYXSbLy0Mc2dDLfdtbT/IVn4keq83P0= golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7 h1:AeiKBIuRw3UomYXSbLy0Mc2dDLfdtbT/IVn4keq83P0=

View File

@@ -17,8 +17,8 @@ package auth
import ( import (
"fmt" "fmt"
"github.com/fatedier/frp/models/consts" "github.com/fatedier/frp/pkg/consts"
"github.com/fatedier/frp/models/msg" "github.com/fatedier/frp/pkg/msg"
"github.com/vaughan0/go-ini" "github.com/vaughan0/go-ini"
) )

View File

@@ -18,7 +18,7 @@ import (
"context" "context"
"fmt" "fmt"
"github.com/fatedier/frp/models/msg" "github.com/fatedier/frp/pkg/msg"
"github.com/coreos/go-oidc" "github.com/coreos/go-oidc"
"github.com/vaughan0/go-ini" "github.com/vaughan0/go-ini"

View File

@@ -18,8 +18,8 @@ import (
"fmt" "fmt"
"time" "time"
"github.com/fatedier/frp/models/msg" "github.com/fatedier/frp/pkg/msg"
"github.com/fatedier/frp/utils/util" "github.com/fatedier/frp/pkg/util/util"
"github.com/vaughan0/go-ini" "github.com/vaughan0/go-ini"
) )

View File

@@ -20,9 +20,9 @@ import (
"strconv" "strconv"
"strings" "strings"
ini "github.com/vaughan0/go-ini" "github.com/fatedier/frp/pkg/auth"
"github.com/fatedier/frp/models/auth" ini "github.com/vaughan0/go-ini"
) )
// ClientCommonConf contains information for a client service. It is // ClientCommonConf contains information for a client service. It is
@@ -100,7 +100,7 @@ type ClientCommonConf struct {
// set. // set.
Start map[string]struct{} `json:"start"` Start map[string]struct{} `json:"start"`
// Protocol specifies the protocol to use when interacting with the server. // Protocol specifies the protocol to use when interacting with the server.
// Valid values are "tcp", "kcp", and "websocket". By default, this value // Valid values are "tcp", "kcp" and "websocket". By default, this value
// is "tcp". // is "tcp".
Protocol string `json:"protocol"` Protocol string `json:"protocol"`
// TLSEnable specifies whether or not TLS should be used when communicating // TLSEnable specifies whether or not TLS should be used when communicating

View File

@@ -20,9 +20,9 @@ import (
"strconv" "strconv"
"strings" "strings"
"github.com/fatedier/frp/models/consts" "github.com/fatedier/frp/pkg/consts"
"github.com/fatedier/frp/models/msg" "github.com/fatedier/frp/pkg/msg"
"github.com/fatedier/frp/utils/util" "github.com/fatedier/frp/pkg/util/util"
ini "github.com/vaughan0/go-ini" ini "github.com/vaughan0/go-ini"
) )

View File

@@ -19,11 +19,11 @@ import (
"strconv" "strconv"
"strings" "strings"
ini "github.com/vaughan0/go-ini" "github.com/fatedier/frp/pkg/auth"
plugin "github.com/fatedier/frp/pkg/plugin/server"
"github.com/fatedier/frp/pkg/util/util"
"github.com/fatedier/frp/models/auth" ini "github.com/vaughan0/go-ini"
plugin "github.com/fatedier/frp/models/plugin/server"
"github.com/fatedier/frp/utils/util"
) )
// ServerCommonConf contains information for a server service. It is // ServerCommonConf contains information for a server service. It is

View File

@@ -19,7 +19,7 @@ import (
"reflect" "reflect"
"strconv" "strconv"
"github.com/fatedier/frp/models/consts" "github.com/fatedier/frp/pkg/consts"
ini "github.com/vaughan0/go-ini" ini "github.com/vaughan0/go-ini"
) )

View File

@@ -15,8 +15,8 @@
package aggregate package aggregate
import ( import (
"github.com/fatedier/frp/models/metrics/mem" "github.com/fatedier/frp/pkg/metrics/mem"
"github.com/fatedier/frp/models/metrics/prometheus" "github.com/fatedier/frp/pkg/metrics/prometheus"
"github.com/fatedier/frp/server/metrics" "github.com/fatedier/frp/server/metrics"
) )

View File

@@ -18,9 +18,9 @@ import (
"sync" "sync"
"time" "time"
"github.com/fatedier/frp/pkg/util/log"
"github.com/fatedier/frp/pkg/util/metric"
server "github.com/fatedier/frp/server/metrics" server "github.com/fatedier/frp/server/metrics"
"github.com/fatedier/frp/utils/log"
"github.com/fatedier/frp/utils/metric"
) )
var sm *serverMetrics = newServerMetrics() var sm *serverMetrics = newServerMetrics()
@@ -69,7 +69,9 @@ func (m *serverMetrics) clearUselessInfo() {
m.mu.Lock() m.mu.Lock()
defer m.mu.Unlock() defer m.mu.Unlock()
for name, data := range m.info.ProxyStatistics { for name, data := range m.info.ProxyStatistics {
if !data.LastCloseTime.IsZero() && time.Since(data.LastCloseTime) > time.Duration(7*24)*time.Hour { if !data.LastCloseTime.IsZero() &&
data.LastStartTime.Before(data.LastCloseTime) &&
time.Since(data.LastCloseTime) > time.Duration(7*24)*time.Hour {
delete(m.info.ProxyStatistics, name) delete(m.info.ProxyStatistics, name)
log.Trace("clear proxy [%s]'s statistics data, lastCloseTime: [%s]", name, data.LastCloseTime.String()) log.Trace("clear proxy [%s]'s statistics data, lastCloseTime: [%s]", name, data.LastCloseTime.String())
} }

View File

@@ -17,7 +17,7 @@ package mem
import ( import (
"time" "time"
"github.com/fatedier/frp/utils/metric" "github.com/fatedier/frp/pkg/util/metric"
) )
const ( const (

View File

@@ -1,7 +1,7 @@
package metrics package metrics
import ( import (
"github.com/fatedier/frp/models/metrics/aggregate" "github.com/fatedier/frp/pkg/metrics/aggregate"
) )
var EnableMem = aggregate.EnableMem var EnableMem = aggregate.EnableMem

View File

@@ -7,9 +7,9 @@ import (
"sync" "sync"
"time" "time"
"github.com/fatedier/frp/models/msg" "github.com/fatedier/frp/pkg/msg"
"github.com/fatedier/frp/utils/log" "github.com/fatedier/frp/pkg/util/log"
"github.com/fatedier/frp/utils/util" "github.com/fatedier/frp/pkg/util/util"
"github.com/fatedier/golib/errors" "github.com/fatedier/golib/errors"
"github.com/fatedier/golib/pool" "github.com/fatedier/golib/pool"

View File

@@ -23,7 +23,7 @@ import (
"net/http/httputil" "net/http/httputil"
"strings" "strings"
frpNet "github.com/fatedier/frp/utils/net" frpNet "github.com/fatedier/frp/pkg/util/net"
) )
const PluginHTTP2HTTPS = "http2https" const PluginHTTP2HTTPS = "http2https"

View File

@@ -22,7 +22,7 @@ import (
"net/http" "net/http"
"strings" "strings"
frpNet "github.com/fatedier/frp/utils/net" frpNet "github.com/fatedier/frp/pkg/util/net"
frpIo "github.com/fatedier/golib/io" frpIo "github.com/fatedier/golib/io"
gnet "github.com/fatedier/golib/net" gnet "github.com/fatedier/golib/net"

View File

@@ -23,7 +23,7 @@ import (
"net/http/httputil" "net/http/httputil"
"strings" "strings"
frpNet "github.com/fatedier/frp/utils/net" frpNet "github.com/fatedier/frp/pkg/util/net"
) )
const PluginHTTPS2HTTP = "https2http" const PluginHTTPS2HTTP = "https2http"

View File

@@ -20,7 +20,7 @@ import (
"log" "log"
"net" "net"
frpNet "github.com/fatedier/frp/utils/net" frpNet "github.com/fatedier/frp/pkg/util/net"
gosocks5 "github.com/armon/go-socks5" gosocks5 "github.com/armon/go-socks5"
) )

View File

@@ -19,7 +19,7 @@ import (
"net" "net"
"net/http" "net/http"
frpNet "github.com/fatedier/frp/utils/net" frpNet "github.com/fatedier/frp/pkg/util/net"
"github.com/gorilla/mux" "github.com/gorilla/mux"
) )

View File

@@ -19,8 +19,8 @@ import (
"errors" "errors"
"fmt" "fmt"
"github.com/fatedier/frp/utils/util" "github.com/fatedier/frp/pkg/util/util"
"github.com/fatedier/frp/utils/xlog" "github.com/fatedier/frp/pkg/util/xlog"
) )
type Manager struct { type Manager struct {

View File

@@ -15,7 +15,7 @@
package plugin package plugin
import ( import (
"github.com/fatedier/frp/models/msg" "github.com/fatedier/frp/pkg/msg"
) )
type Request struct { type Request struct {

View File

@@ -20,7 +20,7 @@ import (
"sync" "sync"
"time" "time"
"github.com/fatedier/frp/models/msg" "github.com/fatedier/frp/pkg/msg"
"github.com/fatedier/golib/errors" "github.com/fatedier/golib/errors"
"github.com/fatedier/golib/pool" "github.com/fatedier/golib/pool"

View File

@@ -10,25 +10,6 @@ import (
"math/big" "math/big"
) )
/*
Example for self-signed certificates by openssl:
Self CA:
openssl genrsa -out ca.key 2048
openssl req -x509 -new -nodes -key ca.key -subj "/CN=example.ca.com" -days 5000 -out ca.crt
Server:
openssl genrsa -out server.key 2048
openssl req -new -key server.key -subj "/CN=example.server.com" -out server.csr
openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 5000
Client:
openssl genrsa -out client.key 2048
openssl req -new -key client.key -subj "/CN=example.client.com" -out client.csr
openssl x509 -req -in client.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out client.crt -days 5000
*/
func newCustomTLSKeyPair(certfile, keyfile string) (*tls.Certificate, error) { func newCustomTLSKeyPair(certfile, keyfile string) (*tls.Certificate, error) {
tlsCert, err := tls.LoadX509KeyPair(certfile, keyfile) tlsCert, err := tls.LoadX509KeyPair(certfile, keyfile)
if err != nil { if err != nil {

View File

@@ -24,7 +24,8 @@ import (
"sync/atomic" "sync/atomic"
"time" "time"
"github.com/fatedier/frp/utils/xlog" "github.com/fatedier/frp/pkg/util/xlog"
gnet "github.com/fatedier/golib/net" gnet "github.com/fatedier/golib/net"
kcp "github.com/fatedier/kcp-go" kcp "github.com/fatedier/kcp-go"
) )

View File

@@ -22,8 +22,8 @@ import (
"net/http" "net/http"
"time" "time"
"github.com/fatedier/frp/utils/util" "github.com/fatedier/frp/pkg/util/util"
"github.com/fatedier/frp/utils/vhost" "github.com/fatedier/frp/pkg/util/vhost"
) )
type HTTPConnectTCPMuxer struct { type HTTPConnectTCPMuxer struct {

View File

@@ -19,7 +19,7 @@ import (
"strings" "strings"
) )
var version string = "0.34.0" var version string = "0.34.2"
func Full() string { func Full() string {
return version return version

View File

@@ -25,8 +25,8 @@ import (
"strings" "strings"
"time" "time"
frpLog "github.com/fatedier/frp/utils/log" frpLog "github.com/fatedier/frp/pkg/util/log"
"github.com/fatedier/frp/utils/util" "github.com/fatedier/frp/pkg/util/util"
"github.com/fatedier/golib/pool" "github.com/fatedier/golib/pool"
) )

View File

@@ -19,8 +19,8 @@ import (
"io/ioutil" "io/ioutil"
"net/http" "net/http"
frpLog "github.com/fatedier/frp/utils/log" frpLog "github.com/fatedier/frp/pkg/util/log"
"github.com/fatedier/frp/utils/version" "github.com/fatedier/frp/pkg/util/version"
) )
var ( var (

View File

@@ -13,6 +13,7 @@ import (
"log" "log"
"net" "net"
"net/http" "net/http"
"net/textproto"
"net/url" "net/url"
"strings" "strings"
"sync" "sync"
@@ -24,6 +25,19 @@ import (
// ReverseProxy is an HTTP Handler that takes an incoming request and // ReverseProxy is an HTTP Handler that takes an incoming request and
// sends it to another server, proxying the response back to the // sends it to another server, proxying the response back to the
// client. // client.
//
// ReverseProxy by default sets the client IP as the value of the
// X-Forwarded-For header.
//
// If an X-Forwarded-For header already exists, the client IP is
// appended to the existing values. As a special case, if the header
// exists in the Request.Header map but has a nil value (such as when
// set by the Director func), the X-Forwarded-For header is
// not modified.
//
// To prevent IP spoofing, be sure to delete any pre-existing
// X-Forwarded-For header coming from the client or
// an untrusted proxy.
type ReverseProxy struct { type ReverseProxy struct {
// Director must be a function which modifies // Director must be a function which modifies
// the request into a new request to be sent // the request into a new request to be sent
@@ -44,9 +58,9 @@ type ReverseProxy struct {
// A negative value means to flush immediately // A negative value means to flush immediately
// after each write to the client. // after each write to the client.
// The FlushInterval is ignored when ReverseProxy // The FlushInterval is ignored when ReverseProxy
// recognizes a response as a streaming response; // recognizes a response as a streaming response, or
// for such responses, writes are flushed to the client // if its ContentLength is -1; for such responses, writes
// immediately. // are flushed to the client immediately.
FlushInterval time.Duration FlushInterval time.Duration
// ErrorLog specifies an optional logger for errors // ErrorLog specifies an optional logger for errors
@@ -97,6 +111,27 @@ func singleJoiningSlash(a, b string) string {
return a + b return a + b
} }
func joinURLPath(a, b *url.URL) (path, rawpath string) {
if a.RawPath == "" && b.RawPath == "" {
return singleJoiningSlash(a.Path, b.Path), ""
}
// Same as singleJoiningSlash, but uses EscapedPath to determine
// whether a slash should be added
apath := a.EscapedPath()
bpath := b.EscapedPath()
aslash := strings.HasSuffix(apath, "/")
bslash := strings.HasPrefix(bpath, "/")
switch {
case aslash && bslash:
return a.Path + b.Path[1:], apath + bpath[1:]
case !aslash && !bslash:
return a.Path + "/" + b.Path, apath + "/" + bpath
}
return a.Path + b.Path, apath + bpath
}
// NewSingleHostReverseProxy returns a new ReverseProxy that routes // NewSingleHostReverseProxy returns a new ReverseProxy that routes
// URLs to the scheme, host, and base path provided in target. If the // URLs to the scheme, host, and base path provided in target. If the
// target's path is "/base" and the incoming request was for "/dir", // target's path is "/base" and the incoming request was for "/dir",
@@ -109,7 +144,7 @@ func NewSingleHostReverseProxy(target *url.URL) *ReverseProxy {
director := func(req *http.Request) { director := func(req *http.Request) {
req.URL.Scheme = target.Scheme req.URL.Scheme = target.Scheme
req.URL.Host = target.Host req.URL.Host = target.Host
req.URL.Path = singleJoiningSlash(target.Path, req.URL.Path) req.URL.Path, req.URL.RawPath = joinURLPath(target, req.URL)
if targetQuery == "" || req.URL.RawQuery == "" { if targetQuery == "" || req.URL.RawQuery == "" {
req.URL.RawQuery = targetQuery + req.URL.RawQuery req.URL.RawQuery = targetQuery + req.URL.RawQuery
} else { } else {
@@ -195,16 +230,19 @@ func (p *ReverseProxy) ServeHTTP(rw http.ResponseWriter, req *http.Request) {
}() }()
} }
outreq := req.WithContext(ctx) outreq := req.Clone(ctx)
if req.ContentLength == 0 { if req.ContentLength == 0 {
outreq.Body = nil // Issue 16036: nil Body for http.Transport retries outreq.Body = nil // Issue 16036: nil Body for http.Transport retries
} }
if outreq.Header == nil {
outreq.Header = make(http.Header) // Issue 33142: historical behavior was to always allocate
}
// ============================= // =============================
// Modified for frp // Modified for frp
outreq = outreq.WithContext(context.WithValue(outreq.Context(), RouteInfoURL, req.URL.Path)) outreq = outreq.Clone(context.WithValue(outreq.Context(), RouteInfoURL, req.URL.Path))
outreq = outreq.WithContext(context.WithValue(outreq.Context(), RouteInfoHost, req.Host)) outreq = outreq.Clone(context.WithValue(outreq.Context(), RouteInfoHost, req.Host))
outreq = outreq.WithContext(context.WithValue(outreq.Context(), RouteInfoRemote, req.RemoteAddr)) outreq = outreq.Clone(context.WithValue(outreq.Context(), RouteInfoRemote, req.RemoteAddr))
// ============================= // =============================
p.Director(outreq) p.Director(outreq)
@@ -244,10 +282,14 @@ func (p *ReverseProxy) ServeHTTP(rw http.ResponseWriter, req *http.Request) {
// If we aren't the first proxy retain prior // If we aren't the first proxy retain prior
// X-Forwarded-For information as a comma+space // X-Forwarded-For information as a comma+space
// separated list and fold multiple headers into one. // separated list and fold multiple headers into one.
if prior, ok := outreq.Header["X-Forwarded-For"]; ok { prior, ok := outreq.Header["X-Forwarded-For"]
omit := ok && prior == nil // Issue 38079: nil now means don't populate the header
if len(prior) > 0 {
clientIP = strings.Join(prior, ", ") + ", " + clientIP clientIP = strings.Join(prior, ", ") + ", " + clientIP
} }
outreq.Header.Set("X-Forwarded-For", clientIP) if !omit {
outreq.Header.Set("X-Forwarded-For", clientIP)
}
} }
res, err := transport.RoundTrip(outreq) res, err := transport.RoundTrip(outreq)
@@ -290,7 +332,7 @@ func (p *ReverseProxy) ServeHTTP(rw http.ResponseWriter, req *http.Request) {
rw.WriteHeader(res.StatusCode) rw.WriteHeader(res.StatusCode)
err = p.copyResponse(rw, res.Body, p.flushInterval(req, res)) err = p.copyResponse(rw, res.Body, p.flushInterval(res))
if err != nil { if err != nil {
defer res.Body.Close() defer res.Body.Close()
// Since we're streaming the response, if we run into an error all we can do // Since we're streaming the response, if we run into an error all we can do
@@ -353,7 +395,7 @@ func shouldPanicOnCopyError(req *http.Request) bool {
func removeConnectionHeaders(h http.Header) { func removeConnectionHeaders(h http.Header) {
for _, f := range h["Connection"] { for _, f := range h["Connection"] {
for _, sf := range strings.Split(f, ",") { for _, sf := range strings.Split(f, ",") {
if sf = strings.TrimSpace(sf); sf != "" { if sf = textproto.TrimString(sf); sf != "" {
h.Del(sf) h.Del(sf)
} }
} }
@@ -362,7 +404,7 @@ func removeConnectionHeaders(h http.Header) {
// flushInterval returns the p.FlushInterval value, conditionally // flushInterval returns the p.FlushInterval value, conditionally
// overriding its value for a specific request/response. // overriding its value for a specific request/response.
func (p *ReverseProxy) flushInterval(req *http.Request, res *http.Response) time.Duration { func (p *ReverseProxy) flushInterval(res *http.Response) time.Duration {
resCT := res.Header.Get("Content-Type") resCT := res.Header.Get("Content-Type")
// For Server-Sent Events responses, flush immediately. // For Server-Sent Events responses, flush immediately.
@@ -371,7 +413,11 @@ func (p *ReverseProxy) flushInterval(req *http.Request, res *http.Response) time
return -1 // negative means immediately return -1 // negative means immediately
} }
// TODO: more specific cases? e.g. res.ContentLength == -1? // We might have the case of streaming for which Content-Length might be unset.
if res.ContentLength == -1 {
return -1
}
return p.FlushInterval return p.FlushInterval
} }
@@ -510,8 +556,6 @@ func (p *ReverseProxy) handleUpgradeResponse(rw http.ResponseWriter, req *http.R
return return
} }
copyHeader(res.Header, rw.Header())
hj, ok := rw.(http.Hijacker) hj, ok := rw.(http.Hijacker)
if !ok { if !ok {
p.getErrorHandler()(rw, req, fmt.Errorf("can't switch protocols using non-Hijacker ResponseWriter type %T", rw)) p.getErrorHandler()(rw, req, fmt.Errorf("can't switch protocols using non-Hijacker ResponseWriter type %T", rw))
@@ -522,13 +566,30 @@ func (p *ReverseProxy) handleUpgradeResponse(rw http.ResponseWriter, req *http.R
p.getErrorHandler()(rw, req, fmt.Errorf("internal error: 101 switching protocols response with non-writable body")) p.getErrorHandler()(rw, req, fmt.Errorf("internal error: 101 switching protocols response with non-writable body"))
return return
} }
defer backConn.Close()
backConnCloseCh := make(chan bool)
go func() {
// Ensure that the cancelation of a request closes the backend.
// See issue https://golang.org/issue/35559.
select {
case <-req.Context().Done():
case <-backConnCloseCh:
}
backConn.Close()
}()
defer close(backConnCloseCh)
conn, brw, err := hj.Hijack() conn, brw, err := hj.Hijack()
if err != nil { if err != nil {
p.getErrorHandler()(rw, req, fmt.Errorf("Hijack failed on protocol switch: %v", err)) p.getErrorHandler()(rw, req, fmt.Errorf("Hijack failed on protocol switch: %v", err))
return return
} }
defer conn.Close() defer conn.Close()
copyHeader(rw.Header(), res.Header)
res.Header = rw.Header()
res.Body = nil // so res.Write only writes the headers; we have res.Body in backConn above res.Body = nil // so res.Write only writes the headers; we have res.Body in backConn above
if err := res.Write(brw); err != nil { if err := res.Write(brw); err != nil {
p.getErrorHandler()(rw, req, fmt.Errorf("response write: %v", err)) p.getErrorHandler()(rw, req, fmt.Errorf("response write: %v", err))

View File

@@ -19,9 +19,9 @@ import (
"strings" "strings"
"time" "time"
"github.com/fatedier/frp/utils/log" "github.com/fatedier/frp/pkg/util/log"
frpNet "github.com/fatedier/frp/utils/net" frpNet "github.com/fatedier/frp/pkg/util/net"
"github.com/fatedier/frp/utils/xlog" "github.com/fatedier/frp/pkg/util/xlog"
"github.com/fatedier/golib/errors" "github.com/fatedier/golib/errors"
) )

View File

@@ -15,7 +15,7 @@
package xlog package xlog
import ( import (
"github.com/fatedier/frp/utils/log" "github.com/fatedier/frp/pkg/util/log"
) )
// Logger is not thread safety for operations on prefix // Logger is not thread safety for operations on prefix

View File

@@ -23,18 +23,18 @@ import (
"sync" "sync"
"time" "time"
"github.com/fatedier/frp/models/auth" "github.com/fatedier/frp/pkg/auth"
"github.com/fatedier/frp/models/config" "github.com/fatedier/frp/pkg/config"
"github.com/fatedier/frp/models/consts" "github.com/fatedier/frp/pkg/consts"
frpErr "github.com/fatedier/frp/models/errors" frpErr "github.com/fatedier/frp/pkg/errors"
"github.com/fatedier/frp/models/msg" "github.com/fatedier/frp/pkg/msg"
plugin "github.com/fatedier/frp/models/plugin/server" plugin "github.com/fatedier/frp/pkg/plugin/server"
"github.com/fatedier/frp/pkg/util/util"
"github.com/fatedier/frp/pkg/util/version"
"github.com/fatedier/frp/pkg/util/xlog"
"github.com/fatedier/frp/server/controller" "github.com/fatedier/frp/server/controller"
"github.com/fatedier/frp/server/metrics" "github.com/fatedier/frp/server/metrics"
"github.com/fatedier/frp/server/proxy" "github.com/fatedier/frp/server/proxy"
"github.com/fatedier/frp/utils/util"
"github.com/fatedier/frp/utils/version"
"github.com/fatedier/frp/utils/xlog"
"github.com/fatedier/golib/control/shutdown" "github.com/fatedier/golib/control/shutdown"
"github.com/fatedier/golib/crypto" "github.com/fatedier/golib/crypto"

View File

@@ -15,13 +15,13 @@
package controller package controller
import ( import (
"github.com/fatedier/frp/models/nathole" "github.com/fatedier/frp/pkg/nathole"
plugin "github.com/fatedier/frp/models/plugin/server" plugin "github.com/fatedier/frp/pkg/plugin/server"
"github.com/fatedier/frp/pkg/util/tcpmux"
"github.com/fatedier/frp/pkg/util/vhost"
"github.com/fatedier/frp/server/group" "github.com/fatedier/frp/server/group"
"github.com/fatedier/frp/server/ports" "github.com/fatedier/frp/server/ports"
"github.com/fatedier/frp/server/visitor" "github.com/fatedier/frp/server/visitor"
"github.com/fatedier/frp/utils/tcpmux"
"github.com/fatedier/frp/utils/vhost"
) )
// All resource managers and controllers // All resource managers and controllers

View File

@@ -21,7 +21,7 @@ import (
"time" "time"
"github.com/fatedier/frp/assets" "github.com/fatedier/frp/assets"
frpNet "github.com/fatedier/frp/utils/net" frpNet "github.com/fatedier/frp/pkg/util/net"
"github.com/gorilla/mux" "github.com/gorilla/mux"
"github.com/prometheus/client_golang/prometheus/promhttp" "github.com/prometheus/client_golang/prometheus/promhttp"

View File

@@ -18,11 +18,11 @@ import (
"encoding/json" "encoding/json"
"net/http" "net/http"
"github.com/fatedier/frp/models/config" "github.com/fatedier/frp/pkg/config"
"github.com/fatedier/frp/models/consts" "github.com/fatedier/frp/pkg/consts"
"github.com/fatedier/frp/models/metrics/mem" "github.com/fatedier/frp/pkg/metrics/mem"
"github.com/fatedier/frp/utils/log" "github.com/fatedier/frp/pkg/util/log"
"github.com/fatedier/frp/utils/version" "github.com/fatedier/frp/pkg/util/version"
"github.com/gorilla/mux" "github.com/gorilla/mux"
) )

Some files were not shown because too many files have changed in this diff Show More