Skip to content

Commit

Permalink
Merge pull request #4 from piaodazhu/dev
Browse files Browse the repository at this point in the history
recorrect misspelling & update README
  • Loading branch information
piaodazhu authored Aug 18, 2023
2 parents de59a5e + 177d0f6 commit 6ef3479
Show file tree
Hide file tree
Showing 7 changed files with 45 additions and 45 deletions.
18 changes: 9 additions & 9 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,8 @@ One day, I needed to add TCP NAT traversal to [my project](https://github.com/pi

So why not write a package to make this more elegant? proxylite was born. Its main features are listed below:
1. Easy to integrate into code. Both server and client structures are provided. Just import this package then register tunnels whenever you want.
2. Dynamic on-demand reverse proxy with online user number control.
3. Service registration and discovery.
2. Dynamic on-demand reverse proxy with serivce controlling (maxOnline, maxServe and deadline).
3. Service discovery and status display.
4. Customized hooks are support. (Under development)

## Concepts
Expand Down Expand Up @@ -44,7 +44,7 @@ func main() {
}
```

These code create a proxylite server, and add avaliable outer port 9930-9932 (Note that it is not 9930 and 9932, but from 9930 to 9932), then run the server. The server is blocked listening on port 9939, inner client will dial this port and server discovery also bind this port.
These code create a proxylite server, and add available outer port 9930-9932 (Note that it is not 9930 and 9932, but from 9930 to 9932), then run the server. The server is blocked listening on port 9939, inner client will dial this port and server discovery also bind this port.

Then, we create a inner client:
```golang
Expand Down Expand Up @@ -98,12 +98,12 @@ Then we get the registration entry if the registration is success. Finally we wa
```golang
func NewProxyLiteServer(portIntervals ...[2]int) *ProxyLiteServer
```
Create a Proxy server with avaliable ports intervals.
Create a Proxy server with available ports intervals.

```golang
func (s *ProxyLiteServer) AddPort(from, to int) bool
```
Create a Proxy server with avaliable ports intervals. Return false if port is invalid.
Create a Proxy server with available ports intervals. Return false if port is invalid.

```golang
func (s *ProxyLiteServer) SetLogger(logger *log.Logger)
Expand All @@ -123,14 +123,14 @@ func NewProxyLiteClient(serverAddr string) *ProxyLiteClient
Create a inner client binding with a proxy server.

```golang
func (c *ProxyLiteClient) AvaliablePorts() ([]int, bool)
func (c *ProxyLiteClient) AvailablePorts() ([]int, bool)
```
Get avaliable ports from proxy server.
Get available ports from proxy server.

```golang
func (c *ProxyLiteClient) AnyPort() (int, bool)
```
Get a random avaliable port from proxy server.
Get a random available port from proxy server.

```golang
type ServiceInfo struct {
Expand Down Expand Up @@ -183,7 +183,7 @@ Set customized logrus logger for the inner client.
```golang
func AskFreePort(addr string) ([]int, error)
```
Ask avaliable free port from proxy server with given address.
Ask available free port from proxy server with given address.


```golang
Expand Down
6 changes: 3 additions & 3 deletions README_ZH.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,8 @@

那为什么不编写一个包来使这变得更加优雅呢?proxylite 应运而生。它的主要特点如下:
1. 易于集成到代码中。提供了服务器和客户端结构。只需导入此包,然后在需要时注册隧道。
2. 动态按需反向代理,带有在线用户数量控制
3. 服务注册和发现
2. 动态按需反向代理,带有丰富的服务控制(在线用户数量,总服务次数,失效时间)
3. 服务发现和服务状态呈现
4. 支持自定义钩子。(开发中)

## 概念
Expand Down Expand Up @@ -126,7 +126,7 @@ func NewProxyLiteClient(serverAddr string) *ProxyLiteClient
创建一个与代理服务器绑定的内部客户端。

```golang
func (c *ProxyLiteClient) AvaliablePorts() ([]int, bool)
func (c *ProxyLiteClient) AvailablePorts() ([]int, bool)
```
从代理服务器获取可用端口。

Expand Down
26 changes: 13 additions & 13 deletions client.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import (
log "github.com/sirupsen/logrus"
)

// RegisterEntry entry to discribe a single service registration
// RegisterEntry entry to describe a single service registration
type RegisterEntry struct {
// Basic Info
Info RegisterInfo
Expand All @@ -28,7 +28,7 @@ type ProxyLiteClient struct {
ready bool
serverAddr string
lock sync.RWMutex
avaliablePorts map[uint32]struct{}
availablePorts map[uint32]struct{}
registered map[uint32]*RegisterEntry
logger *log.Logger
}
Expand All @@ -38,7 +38,7 @@ func NewProxyLiteClient(serverAddr string) *ProxyLiteClient {
client := &ProxyLiteClient{
ready: false,
serverAddr: serverAddr,
avaliablePorts: map[uint32]struct{}{},
availablePorts: map[uint32]struct{}{},
registered: map[uint32]*RegisterEntry{},
logger: log.New(),
}
Expand All @@ -50,40 +50,40 @@ func NewProxyLiteClient(serverAddr string) *ProxyLiteClient {
}
client.ready = true
for _, port := range ports {
client.avaliablePorts[port] = struct{}{}
client.availablePorts[port] = struct{}{}
}
return client
}

// AvaliablePorts Get avaliable ports from proxy server.
func (c *ProxyLiteClient) AvaliablePorts() ([]uint32, bool) {
// availablePorts Get available ports from proxy server.
func (c *ProxyLiteClient) AvailablePorts() ([]uint32, bool) {
ports, err := AskFreePort(c.serverAddr)
if err != nil {
c.ready = false
return nil, false
}
c.ready = true
for _, port := range ports {
c.avaliablePorts[port] = struct{}{}
c.availablePorts[port] = struct{}{}
}
return ports, true
}

// AnyPort Get a random avaliable port from proxy server.
// AnyPort Get a random available port from proxy server.
func (c *ProxyLiteClient) AnyPort() (uint32, bool) {
if c.ready {
for port := range c.avaliablePorts {
for port := range c.availablePorts {
return port, true
}
return 0, false
}

_, ok := c.AvaliablePorts()
_, ok := c.AvailablePorts()
if !ok {
return 0, false
}

for port := range c.avaliablePorts {
for port := range c.availablePorts {
return port, true
}
return 0, false
Expand Down Expand Up @@ -187,7 +187,7 @@ func (c *ProxyLiteClient) RegisterInnerService(info RegisterInfo, ctrl ControlIn
for !serviceEnd {
if inner == nil {
// no inner service. send user close
c.logTunnelMessage(info.Name, "NOSRV", fmt.Sprintf("service not avaliable, uid[%d] [%v]", uid, err))
c.logTunnelMessage(info.Name, "NOSRV", fmt.Sprintf("service not available, uid[%d] [%v]", uid, err))
n = 0
writeUidWithCloseUnsafe(buf[8:], uid)
serviceEnd = true
Expand Down Expand Up @@ -296,7 +296,7 @@ func (c *ProxyLiteClient) logTunnelMessage(service, header, msg string) {
c.logger.Infof("[%s] [%s] %s", service, header, msg)
}

// AskFreePort Ask avaliable free port from proxy server with given address.
// AskFreePort Ask available free port from proxy server with given address.
func AskFreePort(addr string) ([]uint32, error) {
conn, err := net.Dial("tcp", addr)
if err != nil {
Expand Down
10 changes: 5 additions & 5 deletions example/client/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import (

func main() {
client := proxylite.NewProxyLiteClient(":9933")
log.Print(client.AvaliablePorts())
log.Print(client.AvailablePorts())
log.Print(client.ActiveServices())
log.Print(client.AnyPort())
log.Print(client.AnyPort())
Expand All @@ -23,13 +23,13 @@ func main() {
Message: "redis kv",
},
proxylite.ControlInfo{
MaxServeConn: 2,
MaxServeConn: 2,
MaxServeCount: 4,
MaxServeTime: 600,
MaxServeTime: 600,
},
))

log.Print(client.AvaliablePorts())
log.Print(client.AvailablePorts())
log.Print(client.ActiveServices())
log.Print(client.GetRegisterEntryByPort(9931))
log.Print(client.GetRegisterEntryByName("redis"))
Expand All @@ -41,7 +41,7 @@ func main() {
}
<-entry.Done
time.Sleep(time.Microsecond * 10)
log.Print(client.AvaliablePorts())
log.Print(client.AvailablePorts())
log.Print(client.ActiveServices())
log.Print(client.GetRegisterEntryByPort(9931))
log.Print(client.GetRegisterEntryByName("redis"))
Expand Down
4 changes: 2 additions & 2 deletions protocol.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,10 +22,10 @@ const (
TypeDataSegment = 64
)

// AskFreePortReq Ask avaliable free ports request
// AskFreePortReq Ask available free ports request
type AskFreePortReq struct{}

// AskFreePortRsp Ask avaliable free ports response
// AskFreePortRsp Ask available free ports response
type AskFreePortRsp struct {
Ports []uint32
}
Expand Down
16 changes: 8 additions & 8 deletions proxylite_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ func readn(c net.Conn, n int) ([]byte, error) {
return buf, nil
}

func writen(c net.Conn, data []byte, n int) error {
func written(c net.Conn, data []byte, n int) error {
offset := 0

for offset < n {
Expand All @@ -48,7 +48,7 @@ func newTcpEchoServer(addr string, pken int) error {
if err != nil {
break
}
err = writen(c, data, pken)
err = written(c, data, pken)
if err != nil {
break
}
Expand Down Expand Up @@ -113,7 +113,7 @@ func TestBasicUsage(t *testing.T) {
msg := "hello123"
var data []byte
for i := 0; i < 10; i++ {
err := writen(user, []byte(msg), 8)
err := written(user, []byte(msg), 8)
if err != nil {
t.Error("write 1, ", err)
}
Expand Down Expand Up @@ -174,7 +174,7 @@ func TestCancel(t *testing.T) {
msg := "hello123"
var data []byte
for i := 0; i < 10; i++ {
err := writen(user, []byte(msg), 8)
err := written(user, []byte(msg), 8)
if err != nil {
t.Error("write 1, ", err)
}
Expand Down Expand Up @@ -240,7 +240,7 @@ func TestMultiplex(t *testing.T) {
t.Logf("user[%d] is %s\n", i, user.LocalAddr().String())
var data []byte
for j := 0; j < 10; j++ {
err := writen(user, []byte(msg), 8)
err := written(user, []byte(msg), 8)
if err != nil {
emsg := fmt.Sprintf("[%d][%d]write 1: %v", i, j, err)
errmsg <- emsg
Expand Down Expand Up @@ -320,7 +320,7 @@ func TestMultiplexMaxTimeControl(t *testing.T) {
t.Logf("user[%d] is %s\n", i, user.LocalAddr().String())
var data []byte
for j := 0; j < 10; j++ {
err := writen(user, []byte(msg), 8)
err := written(user, []byte(msg), 8)
if err != nil {
emsg := fmt.Sprintf("[%d][%d]write 1: %v", i, j, err)
errmsg <- emsg
Expand Down Expand Up @@ -395,7 +395,7 @@ func TestMultiplexMaxCountControl(t *testing.T) {
msg := fmt.Sprintf("[%d]hello", i)
var data []byte
for j := 0; j < 10; j++ {
err := writen(user, []byte(msg), 8)
err := written(user, []byte(msg), 8)
if err != nil {
emsg := fmt.Sprintf("[%d][%d]write 1: %v", i, j, err)
errmsg <- emsg
Expand Down Expand Up @@ -475,7 +475,7 @@ func TestMultiplexMaxConnControl(t *testing.T) {
t.Logf("user[%d] is %s\n", i, user.LocalAddr().String())
var data []byte
for j := 0; j < 10; j++ {
err := writen(user, []byte(msg), 8)
err := written(user, []byte(msg), 8)
if err != nil {
emsg := fmt.Sprintf("[%d][%d]write 1: %v", i, j, err)
errmsg <- emsg
Expand Down
10 changes: 5 additions & 5 deletions server.go
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ type ProxyLiteServer struct {
logger *log.Logger
}

// NewProxyLiteServer Create a Proxy server with avaliable ports intervals.
// NewProxyLiteServer Create a Proxy server with available ports intervals.
func NewProxyLiteServer(portIntervals ...[2]int) *ProxyLiteServer {
server := &ProxyLiteServer{
all: map[uint32]struct{}{},
Expand All @@ -48,7 +48,7 @@ func NewProxyLiteServer(portIntervals ...[2]int) *ProxyLiteServer {
return server
}

// AddPort Add avaliable ports intervals for server. Return false if port is invalid.
// AddPort Add available ports intervals for server. Return false if port is invalid.
func (s *ProxyLiteServer) AddPort(from, to int) bool {
if from <= 0 || to > 65535 {
return false
Expand Down Expand Up @@ -296,12 +296,12 @@ func (s *ProxyLiteServer) startTunnel(tn *tunnel) {
}

// if MaxServeCount is set not zero, only serve MaxServeCount users.
var comming, leaving *sem.Weighted
var coming, leaving *sem.Weighted
var finiteServeCount bool = false
lastFinish := sync.WaitGroup{}
if tn.ctrl.MaxServeCount > 0 {
finiteServeCount = true
comming = sem.NewWeighted(int64(tn.ctrl.MaxServeCount))
coming = sem.NewWeighted(int64(tn.ctrl.MaxServeCount))
leaving = sem.NewWeighted(int64(tn.ctrl.MaxServeCount) - 1) // last one leave, close tunnel
lastFinish.Add(1)
}
Expand Down Expand Up @@ -417,7 +417,7 @@ func (s *ProxyLiteServer) startTunnel(tn *tunnel) {
}
if finiteServeCount {
// All users have been come.
if !comming.TryAcquire(1) {
if !coming.TryAcquire(1) {
lastFinish.Wait() // wait last user finish
break
}
Expand Down

0 comments on commit 6ef3479

Please sign in to comment.