Merge branch 'master' of https://github.com/gogf/gf into develop

This commit is contained in:
John Guo
2022-05-25 16:02:48 +08:00
15 changed files with 1229 additions and 15 deletions

View File

@ -118,6 +118,26 @@ func ExampleNew() {
// {"id":1,"name":"john"}
}
func ExampleClient_Clone() {
var (
ctx = gctx.New()
client = gclient.New()
)
client.SetCookie("key", "value")
cloneClient := client.Clone()
if r, err := cloneClient.Get(ctx, "http://127.0.0.1:8999/var/json"); err != nil {
panic(err)
} else {
defer r.Close()
fmt.Println(r.ReadAllString())
}
// Output:
// {"id":1,"name":"john"}
}
func ExampleNew_MultiConn_Recommend() {
var (
ctx = gctx.New()

View File

@ -9,7 +9,9 @@ package gclient_test
import (
"bytes"
"context"
"crypto/tls"
"fmt"
"github.com/gogf/gf/v2/debug/gdebug"
"io/ioutil"
"net/http"
"testing"
@ -532,3 +534,27 @@ func Test_WebSocketClient(t *testing.T) {
t.Assert(data, msg)
})
}
func TestLoadKeyCrt(t *testing.T) {
var (
testCrtFile = gfile.Dir(gdebug.CallerFilePath()) + gfile.Separator + "testdata/upload/file1.txt"
testKeyFile = gfile.Dir(gdebug.CallerFilePath()) + gfile.Separator + "testdata/upload/file2.txt"
crtFile = gfile.Dir(gdebug.CallerFilePath()) + gfile.Separator + "testdata/server.crt"
keyFile = gfile.Dir(gdebug.CallerFilePath()) + gfile.Separator + "testdata/server.key"
tlsConfig = &tls.Config{}
)
gtest.C(t, func(t *gtest.T) {
tlsConfig, _ = gclient.LoadKeyCrt("crtFile", "keyFile")
t.AssertNil(tlsConfig)
tlsConfig, _ = gclient.LoadKeyCrt(crtFile, "keyFile")
t.AssertNil(tlsConfig)
tlsConfig, _ = gclient.LoadKeyCrt(testCrtFile, testKeyFile)
t.AssertNil(tlsConfig)
tlsConfig, _ = gclient.LoadKeyCrt(crtFile, keyFile)
t.AssertNE(tlsConfig, nil)
})
}

20
net/gclient/testdata/server.crt vendored Normal file
View File

@ -0,0 +1,20 @@
-----BEGIN CERTIFICATE-----
MIIDVzCCAj+gAwIBAgIJAPRQQvW4UaTJMA0GCSqGSIb3DQEBCwUAMEIxCzAJBgNV
BAYTAlhYMRUwEwYDVQQHDAxEZWZhdWx0IENpdHkxHDAaBgNVBAoME0RlZmF1bHQg
Q29tcGFueSBMdGQwHhcNMTcxMTA2MDMwNjUzWhcNMjcxMTA0MDMwNjUzWjBCMQsw
CQYDVQQGEwJYWDEVMBMGA1UEBwwMRGVmYXVsdCBDaXR5MRwwGgYDVQQKDBNEZWZh
dWx0IENvbXBhbnkgTHRkMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA
rvm9LVnIIPlimBCiNzhLmKqe8soWN7ZND+cN8myD8mcGVZblp01JZbR4n1btEekU
rl3oNr/6aXhLml4ijre150Z73q31XMarlgBtbkbs4Lu22rlLZg/u2hzs9f1aF1VT
qXzru+2ifcYR15Ptoyr8t12dYSQ9YXP7LwzghE9oWw52w0LxlNL0cNq2muSMTelQ
xBU3OuAOdy7dPhiHvkpCCZ5SmwZuK8IpSX0/pJUgDkmd3zfKaaOE4JdLKJ5lWsGF
RgM8leygKfvW4hwguEh7S1UG9CT/6jqPpyiPii3Qc4dxrogmiTPlFpYWY8bFNa9s
iuwr8KFPPZIIwxZgDLAvywIDAQABo1AwTjAdBgNVHQ4EFgQUMsBb4Dhl4OZl+xw8
Pl2wkRhUVi0wHwYDVR0jBBgwFoAUMsBb4Dhl4OZl+xw8Pl2wkRhUVi0wDAYDVR0T
BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEAQEaUz59HZHbPt4Etv4zASn3mFJeR
QZHmUnKhVjB163xvHoN46GJmc4VnWahOd1a7i7b+qK6AnFzKI5zmZ4z5ZrjwqZiG
epvAQ4FVbZy1nzMjBXQIyAkiDgbdjASvOUoE4OlKA3jLH7H204K3jhpaFTKVQNeY
BGEALlKdveQUjlp5YTk38NrrZg0yzGDBUQ6X6PCYB+kdEOOpyx6061jxgIVKuBaY
37I88vGcC9C3PVhYvDcilMkEcUPnp7DRMiZpXU7DraCWlWbr/b+47NkTPBWiNiLC
nlfGdCGuL0ylZ16nEpkvZVUWiAijh3sUYbz1dbBACw+8dTG/+vlKUuz/hA==
-----END CERTIFICATE-----

27
net/gclient/testdata/server.key vendored Normal file
View File

@ -0,0 +1,27 @@
-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEArvm9LVnIIPlimBCiNzhLmKqe8soWN7ZND+cN8myD8mcGVZbl
p01JZbR4n1btEekUrl3oNr/6aXhLml4ijre150Z73q31XMarlgBtbkbs4Lu22rlL
Zg/u2hzs9f1aF1VTqXzru+2ifcYR15Ptoyr8t12dYSQ9YXP7LwzghE9oWw52w0Lx
lNL0cNq2muSMTelQxBU3OuAOdy7dPhiHvkpCCZ5SmwZuK8IpSX0/pJUgDkmd3zfK
aaOE4JdLKJ5lWsGFRgM8leygKfvW4hwguEh7S1UG9CT/6jqPpyiPii3Qc4dxrogm
iTPlFpYWY8bFNa9siuwr8KFPPZIIwxZgDLAvywIDAQABAoIBAQCRYfXaWY/cPfm6
qY9u3DqLpbCdwGWHctRC01MWSy2y2gE8Wj2ErcW/WJ0kn4Ao8oX5fxMzcn2o5ofC
wlZqSKA+gqTnV5jXtkbZQo+qIgotjCqZP34zVie6WHBWz2PsoTv7Rk1D/2WUpV8r
xMCdY1lJLeJW1Vqev1REOqnNpYDqrhBsCCNn0vvCOS+/UbTbJ2d4sw3BuqGfd2Uk
eIXSlwkODKf2Tk3b4tktC7I0XZfBeO1DEpBJAYP+zPTt/we/Kne6FI/squdephJL
JMj30bSZ0jpgP/K6otEiE3pfdzijTFPjw8ayU1yuZZMSRLJtFKbSfSNGUfXVHwZP
6ygv91DJAoGBAOIawxKzSVJxz6yvaxh2Zxnib33TmpyWcDVKje/bk88hxEXm7C3Q
OPMGbfy37mc6jDoH2erv2GFDFRCezHKS+OEN5heZnL3m/c6E0A4K/V9VUDSnABLi
jmDRw45mDZq9edGxkvydHYMdJhH+hbbWrxr8LQtsBLuaDzLEkHa8cscdAoGBAMYc
Wd4x3fBCA2/Xd98+ZTpYhtbYDvIYl2gfVLSiLuvf3ZgnWozibCOJg5DVh/0vCS+G
ct4Ga3e17qRXZOXuSoZdBIh7nV2mQ0+zc+4ZE7UE0cAU4KYkGBabt1J4HdIxCOUB
60smideKfFKurh5OCxSP76tIwOhcSXpduhmb/VYHAoGAfe7V89Zz4j2No+rYRXm9
FwetfXGcTdbkjGoIAC5WdymhfiWOKj4tWf6cyANR/6D2dWPmFhqcdB++3dD0omQF
xqPNIhvm10aO2rXSg9/PG4gS8iCJw/r3vilXODrTHPqnnQnAin6f72UOzTrsEtgk
E22dUR1KzYqTKH2e0ONJMmkCgYBlcFzftd7zR4nk+YoKiDNi9bNNTOISOl9EVE6W
Ezk9U6puXzAxVTqT07THM17nV+83I3urjdP3PvPLuGgUh7gnJnfMvqbsLdbnd3aT
4slBdg9EcCw7Rd4DrYXnt1Nlre/k+t+U4k3QTLutxn2nTMTFqZHJvX3xPFfvTRCe
Tk4gfwKBgDDo8/NvOZQJi+A5qJFooWkm5mFjsq2RTuOE5dZlgfNp3FzbJ1wcC0X5
ifOWAMGIyw0m68Q07fL2rsfvfB69iB6oRv6WCuUXH2f5THgUeVxxYHHUfGJQQkcu
XJXnZDH/OB1Pg674BzC6dGsHDM19kgWmr0aVQK4jueqxsm5pchEr
-----END RSA PRIVATE KEY-----

View File

@ -224,18 +224,9 @@ func Test_Params_File_Upload_Required(t *testing.T) {
}
type Res struct{}
dstDirPath := gfile.Temp(gtime.TimestampNanoStr())
s := g.Server(guid.S())
s.Use(ghttp.MiddlewareHandlerResponse)
s.BindHandler("/upload/required", func(ctx context.Context, req *Req) (res *Res, err error) {
var (
r = g.RequestFromCtx(ctx)
)
file := req.File
if name, err := file.Save(dstDirPath); err == nil {
r.Response.WriteExit(name)
}
r.Response.WriteExit("upload failed")
return
})
s.SetDumpRouterMap(false)
@ -246,9 +237,7 @@ func Test_Params_File_Upload_Required(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
client := g.Client()
client.SetPrefix(fmt.Sprintf("http://127.0.0.1:%d", s.GetListenedPort()))
_, err := client.Post(ctx, "/upload/required")
if err != nil {
t.Assert(err.Error(), "upload file is required")
}
content := client.PostContent(ctx, "/upload/required")
t.Assert(content, `{"code":51,"message":"upload file is required","data":null}`)
})
}

View File

@ -84,6 +84,11 @@ func (s *Server) SetAddress(address string) {
s.address = address
}
// GetAddress get the listening address for server.
func (s *Server) GetAddress() string {
return s.address
}
// SetHandler sets the connection handler for server.
func (s *Server) SetHandler(handler func(*Conn)) {
s.handler = handler

View File

@ -8,7 +8,6 @@ package gtcp_test
import (
"fmt"
"github.com/gogf/gf/v2/net/gtcp"
)

View File

@ -8,6 +8,8 @@ package gtcp_test
import (
"fmt"
"github.com/gogf/gf/v2/debug/gdebug"
"github.com/gogf/gf/v2/os/gfile"
"testing"
"time"
@ -96,6 +98,34 @@ func Test_Package_Basic(t *testing.T) {
})
}
func Test_Package_Basic_HeaderSize1(t *testing.T) {
p, _ := gtcp.GetFreePort()
s := gtcp.NewServer(fmt.Sprintf(`:%d`, p), func(conn *gtcp.Conn) {
defer conn.Close()
for {
data, err := conn.RecvPkg(gtcp.PkgOption{HeaderSize: 1})
if err != nil {
break
}
conn.SendPkg(data)
}
})
go s.Run()
defer s.Close()
time.Sleep(100 * time.Millisecond)
// SendRecvPkg with empty data.
gtest.C(t, func(t *gtest.T) {
conn, err := gtcp.NewConn(fmt.Sprintf("127.0.0.1:%d", p))
t.AssertNil(err)
defer conn.Close()
data := make([]byte, 0)
result, err := conn.SendRecvPkg(data)
t.AssertNil(err)
t.AssertNil(result)
})
}
func Test_Package_Timeout(t *testing.T) {
p, _ := gtcp.GetFreePort()
s := gtcp.NewServer(fmt.Sprintf(`:%d`, p), func(conn *gtcp.Conn) {
@ -130,6 +160,15 @@ func Test_Package_Timeout(t *testing.T) {
t.AssertNil(err)
t.Assert(result, data)
})
gtest.C(t, func(t *gtest.T) {
conn, err := gtcp.NewConn(fmt.Sprintf("127.0.0.1:%d", p))
t.AssertNil(err)
defer conn.Close()
data := []byte("10000")
result, err := conn.SendRecvPkgWithTimeout(data, time.Second*2, gtcp.PkgOption{HeaderSize: 5})
t.AssertNE(err, nil)
t.AssertNil(result)
})
}
func Test_Package_Option(t *testing.T) {
@ -171,3 +210,151 @@ func Test_Package_Option(t *testing.T) {
t.Assert(result, data)
})
}
func Test_Package_Option_HeadSize3(t *testing.T) {
p, _ := gtcp.GetFreePort()
s := gtcp.NewServer(fmt.Sprintf(`:%d`, p), func(conn *gtcp.Conn) {
defer conn.Close()
option := gtcp.PkgOption{HeaderSize: 3}
for {
data, err := conn.RecvPkg(option)
if err != nil {
break
}
gtest.Assert(conn.SendPkg(data, option), nil)
}
})
go s.Run()
defer s.Close()
time.Sleep(100 * time.Millisecond)
gtest.C(t, func(t *gtest.T) {
conn, err := gtcp.NewConn(fmt.Sprintf("127.0.0.1:%d", p))
t.AssertNil(err)
defer conn.Close()
data := make([]byte, 0xFF)
data[100] = byte(65)
data[200] = byte(85)
result, err := conn.SendRecvPkg(data, gtcp.PkgOption{HeaderSize: 3})
t.AssertNil(err)
t.Assert(result, data)
})
}
func Test_Package_Option_HeadSize4(t *testing.T) {
p, _ := gtcp.GetFreePort()
s := gtcp.NewServer(fmt.Sprintf(`:%d`, p), func(conn *gtcp.Conn) {
defer conn.Close()
option := gtcp.PkgOption{HeaderSize: 4}
for {
data, err := conn.RecvPkg(option)
if err != nil {
break
}
gtest.Assert(conn.SendPkg(data, option), nil)
}
})
go s.Run()
defer s.Close()
time.Sleep(100 * time.Millisecond)
// SendRecvPkg with big data - failure.
gtest.C(t, func(t *gtest.T) {
conn, err := gtcp.NewConn(fmt.Sprintf("127.0.0.1:%d", p))
t.AssertNil(err)
defer conn.Close()
data := make([]byte, 0xFFFF+1)
_, err = conn.SendRecvPkg(data, gtcp.PkgOption{HeaderSize: 4})
t.Assert(err, nil)
})
// SendRecvPkg with big data - success.
gtest.C(t, func(t *gtest.T) {
conn, err := gtcp.NewConn(fmt.Sprintf("127.0.0.1:%d", p))
t.AssertNil(err)
defer conn.Close()
data := make([]byte, 0xFF)
data[100] = byte(65)
data[200] = byte(85)
result, err := conn.SendRecvPkg(data, gtcp.PkgOption{HeaderSize: 4})
t.AssertNil(err)
t.Assert(result, data)
})
// pkgOption.HeaderSize oversize
gtest.C(t, func(t *gtest.T) {
conn, err := gtcp.NewConn(fmt.Sprintf("127.0.0.1:%d", p))
t.AssertNil(err)
defer conn.Close()
data := make([]byte, 0xFF)
data[100] = byte(65)
data[200] = byte(85)
_, err = conn.SendRecvPkg(data, gtcp.PkgOption{HeaderSize: 5})
t.AssertNE(err, nil)
})
}
func Test_Server_NewServerKeyCrt(t *testing.T) {
var (
noCrtFile = "noCrtFile"
noKeyFile = "noKeyFile"
crtFile = gfile.Dir(gdebug.CallerFilePath()) + gfile.Separator + "testdata/crtFile"
keyFile = gfile.Dir(gdebug.CallerFilePath()) + gfile.Separator + "testdata/keyFile"
)
gtest.C(t, func(t *gtest.T) {
addr := "127.0.0.1:%d"
freePort, _ := gtcp.GetFreePort()
addr = fmt.Sprintf(addr, freePort)
s, err := gtcp.NewServerKeyCrt(addr, noCrtFile, noKeyFile, func(conn *gtcp.Conn) {
})
if err != nil {
t.AssertNil(s)
}
})
gtest.C(t, func(t *gtest.T) {
addr := "127.0.0.1:%d"
freePort, _ := gtcp.GetFreePort()
addr = fmt.Sprintf(addr, freePort)
s, err := gtcp.NewServerKeyCrt(addr, crtFile, noKeyFile, func(conn *gtcp.Conn) {
})
if err != nil {
t.AssertNil(s)
}
})
gtest.C(t, func(t *gtest.T) {
addr := "127.0.0.1:%d"
freePort, _ := gtcp.GetFreePort()
addr = fmt.Sprintf(addr, freePort)
s, err := gtcp.NewServerKeyCrt(addr, crtFile, keyFile, func(conn *gtcp.Conn) {
})
if err != nil {
t.AssertNil(s)
}
})
}
func Test_Conn_RecvPkgError(t *testing.T) {
p, _ := gtcp.GetFreePort()
s := gtcp.NewServer(fmt.Sprintf(`:%d`, p), func(conn *gtcp.Conn) {
defer conn.Close()
option := gtcp.PkgOption{HeaderSize: 5}
for {
_, err := conn.RecvPkg(option)
if err != nil {
break
}
}
})
go s.Run()
defer s.Close()
time.Sleep(100 * time.Millisecond)
gtest.C(t, func(t *gtest.T) {
conn, err := gtcp.NewConn(fmt.Sprintf("127.0.0.1:%d", p))
t.AssertNil(err)
defer conn.Close()
data := make([]byte, 65536)
result, err := conn.SendRecvPkg(data)
t.AssertNE(err, nil)
t.Assert(result, nil)
})
}

View File

@ -170,4 +170,26 @@ func Test_Pool_Package_Option(t *testing.T) {
t.AssertNil(err)
t.Assert(result, data)
})
// SendRecvPkgWithTimeout with big data - failure.
gtest.C(t, func(t *gtest.T) {
conn, err := gtcp.NewPoolConn(fmt.Sprintf("127.0.0.1:%d", p))
t.AssertNil(err)
defer conn.Close()
data := make([]byte, 0xFF+1)
result, err := conn.SendRecvPkgWithTimeout(data, time.Second, gtcp.PkgOption{HeaderSize: 1})
t.AssertNE(err, nil)
t.Assert(result, nil)
})
// SendRecvPkgWithTimeout with big data - success.
gtest.C(t, func(t *gtest.T) {
conn, err := gtcp.NewPoolConn(fmt.Sprintf("127.0.0.1:%d", p))
t.AssertNil(err)
defer conn.Close()
data := make([]byte, 0xFF)
data[100] = byte(65)
data[200] = byte(85)
result, err := conn.SendRecvPkgWithTimeout(data, time.Second, gtcp.PkgOption{HeaderSize: 1})
t.AssertNil(err)
t.Assert(result, data)
})
}

View File

@ -8,6 +8,7 @@ package gtcp_test
import (
"fmt"
"github.com/gogf/gf/v2/text/gstr"
"testing"
"time"
@ -40,6 +41,11 @@ func Test_Pool_Basic1(t *testing.T) {
err = conn.SendPkgWithTimeout(data, time.Second)
t.AssertNil(err)
})
gtest.C(t, func(t *gtest.T) {
_, err := gtcp.NewPoolConn(fmt.Sprintf("127.0.0.1:80"))
t.AssertNE(err, nil)
})
}
func Test_Pool_Basic2(t *testing.T) {
@ -64,3 +70,195 @@ func Test_Pool_Basic2(t *testing.T) {
t.AssertNE(err, nil)
})
}
func Test_Pool_Send(t *testing.T) {
p, _ := gtcp.GetFreePort()
s := gtcp.NewServer(fmt.Sprintf(`:%d`, p), func(conn *gtcp.Conn) {
for {
data, err := conn.Recv(-1)
if err != nil {
break
}
conn.Send(data)
}
})
go s.Run()
defer s.Close()
time.Sleep(100 * time.Millisecond)
gtest.C(t, func(t *gtest.T) {
conn, err := gtcp.NewPoolConn(fmt.Sprintf("127.0.0.1:%d", p))
t.AssertNil(err)
defer conn.Close()
data := []byte("9999")
err = conn.Send(data)
t.AssertNil(err)
recv, err := conn.Recv(-1)
t.AssertNil(err)
t.Assert(recv, data)
})
}
func Test_Pool_Recv(t *testing.T) {
p, _ := gtcp.GetFreePort()
s := gtcp.NewServer(fmt.Sprintf(`:%d`, p), func(conn *gtcp.Conn) {
for {
data, err := conn.Recv(-1)
if err != nil {
break
}
conn.Send(data)
}
})
go s.Run()
defer s.Close()
time.Sleep(100 * time.Millisecond)
gtest.C(t, func(t *gtest.T) {
conn, err := gtcp.NewPoolConn(fmt.Sprintf("127.0.0.1:%d", p))
t.AssertNil(err)
defer conn.Close()
data := []byte("9999")
err = conn.Send(data)
t.AssertNil(err)
time.Sleep(100 * time.Millisecond)
recv, err := conn.Recv(-1)
t.AssertNil(err)
t.Assert(recv, data)
})
}
func Test_Pool_RecvLine(t *testing.T) {
p, _ := gtcp.GetFreePort()
s := gtcp.NewServer(fmt.Sprintf(`:%d`, p), func(conn *gtcp.Conn) {
for {
data, err := conn.Recv(-1)
if err != nil {
break
}
conn.Send(data)
}
})
go s.Run()
defer s.Close()
time.Sleep(100 * time.Millisecond)
gtest.C(t, func(t *gtest.T) {
conn, err := gtcp.NewPoolConn(fmt.Sprintf("127.0.0.1:%d", p))
t.AssertNil(err)
defer conn.Close()
data := []byte("9999\n")
err = conn.Send(data)
t.AssertNil(err)
time.Sleep(100 * time.Millisecond)
recv, err := conn.RecvLine()
t.AssertNil(err)
splitData := gstr.Split(string(data), "\n")
t.Assert(recv, splitData[0])
})
}
func Test_Pool_RecvTill(t *testing.T) {
p, _ := gtcp.GetFreePort()
s := gtcp.NewServer(fmt.Sprintf(`:%d`, p), func(conn *gtcp.Conn) {
for {
data, err := conn.Recv(-1)
if err != nil {
break
}
conn.Send(data)
}
})
go s.Run()
defer s.Close()
time.Sleep(100 * time.Millisecond)
gtest.C(t, func(t *gtest.T) {
conn, err := gtcp.NewPoolConn(fmt.Sprintf("127.0.0.1:%d", p))
t.AssertNil(err)
defer conn.Close()
data := []byte("9999\n")
err = conn.Send(data)
t.AssertNil(err)
time.Sleep(100 * time.Millisecond)
recv, err := conn.RecvTill([]byte("\n"))
t.AssertNil(err)
t.Assert(recv, data)
})
}
func Test_Pool_RecvWithTimeout(t *testing.T) {
p, _ := gtcp.GetFreePort()
s := gtcp.NewServer(fmt.Sprintf(`:%d`, p), func(conn *gtcp.Conn) {
for {
data, err := conn.Recv(-1)
if err != nil {
break
}
conn.Send(data)
}
})
go s.Run()
defer s.Close()
time.Sleep(100 * time.Millisecond)
gtest.C(t, func(t *gtest.T) {
conn, err := gtcp.NewPoolConn(fmt.Sprintf("127.0.0.1:%d", p))
t.AssertNil(err)
defer conn.Close()
data := []byte("9999")
err = conn.Send(data)
t.AssertNil(err)
time.Sleep(100 * time.Millisecond)
recv, err := conn.RecvWithTimeout(-1, time.Millisecond*500)
t.AssertNil(err)
t.Assert(data, recv)
})
}
func Test_Pool_SendWithTimeout(t *testing.T) {
p, _ := gtcp.GetFreePort()
s := gtcp.NewServer(fmt.Sprintf(`:%d`, p), func(conn *gtcp.Conn) {
for {
data, err := conn.Recv(-1)
if err != nil {
break
}
conn.Send(data)
}
})
go s.Run()
defer s.Close()
time.Sleep(100 * time.Millisecond)
gtest.C(t, func(t *gtest.T) {
conn, err := gtcp.NewPoolConn(fmt.Sprintf("127.0.0.1:%d", p))
t.AssertNil(err)
defer conn.Close()
data := []byte("9999")
err = conn.SendWithTimeout(data, time.Millisecond*500)
t.AssertNil(err)
recv, err := conn.Recv(-1)
t.AssertNil(err)
t.Assert(data, recv)
})
}
func Test_Pool_SendRecvWithTimeout(t *testing.T) {
p, _ := gtcp.GetFreePort()
s := gtcp.NewServer(fmt.Sprintf(`:%d`, p), func(conn *gtcp.Conn) {
for {
data, err := conn.Recv(-1)
if err != nil {
break
}
conn.Send(data)
}
})
go s.Run()
defer s.Close()
time.Sleep(100 * time.Millisecond)
gtest.C(t, func(t *gtest.T) {
conn, err := gtcp.NewPoolConn(fmt.Sprintf("127.0.0.1:%d", p))
t.AssertNil(err)
defer conn.Close()
data := []byte("9999")
recv, err := conn.SendRecvWithTimeout(data, -1, time.Millisecond*500)
t.AssertNil(err)
t.Assert(data, recv)
})
}

View File

@ -0,0 +1,674 @@
// Copyright GoFrame Author(https://goframe.org). All Rights Reserved.
//
// This Source Code Form is subject to the terms of the MIT License.
// If a copy of the MIT was not distributed with this file,
// You can obtain one at https://github.com/gogf/gf.
package gtcp_test
import (
"crypto/tls"
"fmt"
"github.com/gogf/gf/v2/debug/gdebug"
"github.com/gogf/gf/v2/net/gtcp"
"github.com/gogf/gf/v2/os/gfile"
"github.com/gogf/gf/v2/test/gtest"
"github.com/gogf/gf/v2/text/gstr"
"testing"
"time"
)
var (
simpleTimeout = time.Millisecond * 100
sendData = []byte("hello")
invalidAddr = "127.0.0.1:99999"
crtFile = gfile.Dir(gdebug.CallerFilePath()) + gfile.Separator + "testdata/server.crt"
keyFile = gfile.Dir(gdebug.CallerFilePath()) + gfile.Separator + "testdata/server.key"
)
func getFreePortAddr() string {
addr := "127.0.0.1:%d"
freePort, _ := gtcp.GetFreePort()
return fmt.Sprintf(addr, freePort)
}
func startTCPServer(addr string) {
s := gtcp.NewServer(addr, func(conn *gtcp.Conn) {
defer conn.Close()
for {
data, err := conn.Recv(-1)
if err != nil {
break
}
conn.Send(data)
}
})
go s.Run()
time.Sleep(simpleTimeout)
}
func startTCPPkgServer(addr string) {
s := gtcp.NewServer(addr, func(conn *gtcp.Conn) {
defer conn.Close()
for {
data, err := conn.RecvPkg()
if err != nil {
break
}
conn.SendPkg(data)
}
})
go s.Run()
time.Sleep(simpleTimeout)
}
func startTCPTLSServer(addr string) {
tlsConfig := &tls.Config{
InsecureSkipVerify: true,
Certificates: []tls.Certificate{
tls.Certificate{},
},
}
s := gtcp.NewServerTLS(addr, tlsConfig, func(conn *gtcp.Conn) {
defer conn.Close()
for {
data, err := conn.Recv(-1)
if err != nil {
break
}
conn.Send(data)
}
})
go s.Run()
time.Sleep(simpleTimeout)
}
func startTCPKeyCrtServer(addr string) {
s, _ := gtcp.NewServerKeyCrt(addr, crtFile, keyFile, func(conn *gtcp.Conn) {
defer conn.Close()
for {
data, err := conn.Recv(-1)
if err != nil {
break
}
conn.Send(data)
}
})
go s.Run()
time.Sleep(simpleTimeout)
}
func TestGetFreePorts(t *testing.T) {
ports, _ := gtcp.GetFreePorts(2)
gtest.C(t, func(t *gtest.T) {
t.AssertGT(ports[0], 0)
t.AssertGT(ports[1], 0)
})
addr := fmt.Sprintf("%s:%d", "127.0.0.1", ports[0])
startTCPServer(addr)
time.Sleep(simpleTimeout)
gtest.C(t, func(t *gtest.T) {
conn, err := gtcp.NewPoolConn(fmt.Sprintf("127.0.0.1:%d", ports[0]))
t.AssertNil(err)
defer conn.Close()
recv, err := conn.SendRecv(sendData, -1)
t.AssertNil(err)
t.Assert(recv, sendData)
})
gtest.C(t, func(t *gtest.T) {
conn, err := gtcp.NewPoolConn(fmt.Sprintf("127.0.0.1:%d", 80))
t.AssertNE(err, nil)
t.AssertNil(conn)
})
}
func TestMustGetFreePort(t *testing.T) {
port := gtcp.MustGetFreePort()
addr := fmt.Sprintf("%s:%d", "127.0.0.1", port)
startTCPServer(addr)
gtest.C(t, func(t *gtest.T) {
recv, err := gtcp.SendRecv(addr, sendData, -1)
t.AssertNil(err)
t.Assert(sendData, recv)
})
}
func TestNewConn(t *testing.T) {
addr := getFreePortAddr()
gtest.C(t, func(t *gtest.T) {
conn, err := gtcp.NewConn(addr, simpleTimeout)
t.AssertNil(conn)
t.AssertNE(err, nil)
})
gtest.C(t, func(t *gtest.T) {
startTCPServer(addr)
conn, err := gtcp.NewConn(addr, simpleTimeout)
t.AssertNil(err)
t.AssertNE(conn, nil)
defer conn.Close()
recv, err := conn.SendRecv(sendData, -1)
t.AssertNil(err)
t.Assert(recv, sendData)
})
}
//TODO
func TestNewConnTLS(t *testing.T) {
addr := getFreePortAddr()
gtest.C(t, func(t *gtest.T) {
conn, err := gtcp.NewConnTLS(addr, &tls.Config{})
t.AssertNil(conn)
t.AssertNE(err, nil)
})
gtest.C(t, func(t *gtest.T) {
startTCPTLSServer(addr)
conn, err := gtcp.NewConnTLS(addr, &tls.Config{
InsecureSkipVerify: true,
Certificates: []tls.Certificate{
tls.Certificate{},
},
})
t.AssertNil(conn)
t.AssertNE(err, nil)
})
}
func TestNewConnKeyCrt(t *testing.T) {
addr := getFreePortAddr()
gtest.C(t, func(t *gtest.T) {
conn, err := gtcp.NewConnKeyCrt(addr, crtFile, keyFile)
t.AssertNil(conn)
t.AssertNE(err, nil)
})
gtest.C(t, func(t *gtest.T) {
startTCPKeyCrtServer(addr)
time.Sleep(simpleTimeout)
conn, err := gtcp.NewConnKeyCrt(addr, crtFile, keyFile)
t.AssertNil(conn)
t.AssertNE(err, nil)
})
}
func TestConn_Send(t *testing.T) {
addr := getFreePortAddr()
startTCPServer(addr)
gtest.C(t, func(t *gtest.T) {
conn, err := gtcp.NewConn(addr)
t.AssertNil(err)
t.AssertNE(conn, nil)
err = conn.Send(sendData, gtcp.Retry{Count: 1})
t.AssertNil(err)
recv, err := conn.Recv(-1)
t.AssertNil(err)
t.Assert(recv, sendData)
})
}
func TestConn_SendWithTimeout(t *testing.T) {
addr := getFreePortAddr()
startTCPServer(addr)
gtest.C(t, func(t *gtest.T) {
conn, err := gtcp.NewConn(addr)
t.AssertNil(err)
t.AssertNE(conn, nil)
err = conn.SendWithTimeout(sendData, time.Second, gtcp.Retry{Count: 1})
t.AssertNil(err)
recv, err := conn.Recv(-1)
t.AssertNil(err)
t.Assert(recv, sendData)
})
}
func TestConn_SendRecv(t *testing.T) {
addr := getFreePortAddr()
startTCPServer(addr)
gtest.C(t, func(t *gtest.T) {
conn, err := gtcp.NewConn(addr)
t.AssertNil(err)
t.AssertNE(conn, nil)
recv, err := conn.SendRecv(sendData, -1, gtcp.Retry{Count: 1})
t.AssertNil(err)
t.Assert(recv, sendData)
})
}
func TestConn_SendRecvWithTimeout(t *testing.T) {
addr := getFreePortAddr()
startTCPServer(addr)
gtest.C(t, func(t *gtest.T) {
conn, err := gtcp.NewConn(addr)
t.AssertNil(err)
t.AssertNE(conn, nil)
recv, err := conn.SendRecvWithTimeout(sendData, -1, time.Second, gtcp.Retry{Count: 1})
t.AssertNil(err)
t.Assert(recv, sendData)
})
}
func TestConn_RecvWithTimeout(t *testing.T) {
addr := getFreePortAddr()
startTCPServer(addr)
gtest.C(t, func(t *gtest.T) {
conn, err := gtcp.NewConn(addr)
t.AssertNil(err)
t.AssertNE(conn, nil)
conn.Send(sendData)
recv, err := conn.RecvWithTimeout(-1, time.Second, gtcp.Retry{Count: 1})
t.AssertNil(err)
t.Assert(recv, sendData)
})
}
func TestConn_RecvLine(t *testing.T) {
addr := getFreePortAddr()
startTCPServer(addr)
gtest.C(t, func(t *gtest.T) {
conn, err := gtcp.NewConn(addr)
t.AssertNil(err)
t.AssertNE(conn, nil)
data := []byte("hello\n")
conn.Send(data)
recv, err := conn.RecvLine(gtcp.Retry{Count: 1})
t.AssertNil(err)
splitData := gstr.Split(string(data), "\n")
t.Assert(recv, splitData[0])
})
}
func TestConn_RecvTill(t *testing.T) {
addr := getFreePortAddr()
startTCPServer(addr)
gtest.C(t, func(t *gtest.T) {
conn, err := gtcp.NewConn(addr)
t.AssertNil(err)
t.AssertNE(conn, nil)
conn.Send(sendData)
recv, err := conn.RecvTill([]byte("hello"), gtcp.Retry{Count: 1})
t.AssertNil(err)
t.Assert(recv, sendData)
})
}
func TestConn_SetDeadline(t *testing.T) {
addr := getFreePortAddr()
startTCPServer(addr)
gtest.C(t, func(t *gtest.T) {
conn, err := gtcp.NewConn(addr)
t.AssertNil(err)
t.AssertNE(conn, nil)
conn.SetDeadline(time.Time{})
err = conn.Send(sendData, gtcp.Retry{Count: 1})
t.AssertNil(err)
recv, err := conn.Recv(-1)
t.AssertNil(err)
t.Assert(recv, sendData)
})
}
func TestConn_SetReceiveBufferWait(t *testing.T) {
addr := getFreePortAddr()
startTCPServer(addr)
gtest.C(t, func(t *gtest.T) {
conn, err := gtcp.NewConn(addr)
t.AssertNil(err)
t.AssertNE(conn, nil)
conn.SetReceiveBufferWait(time.Millisecond * 100)
err = conn.Send(sendData, gtcp.Retry{Count: 1})
t.AssertNil(err)
recv, err := conn.Recv(-1)
t.AssertNil(err)
t.Assert(recv, sendData)
})
}
func TestNewNetConnKeyCrt(t *testing.T) {
addr := getFreePortAddr()
startTCPKeyCrtServer(addr)
gtest.C(t, func(t *gtest.T) {
conn, err := gtcp.NewNetConnKeyCrt(addr, "crtFile", keyFile, time.Second)
t.AssertNil(conn)
t.AssertNE(err, nil)
})
gtest.C(t, func(t *gtest.T) {
conn, err := gtcp.NewNetConnKeyCrt(addr, crtFile, keyFile, time.Second)
t.AssertNil(conn)
t.AssertNE(err, nil)
})
}
func TestSend(t *testing.T) {
addr := getFreePortAddr()
startTCPServer(addr)
gtest.C(t, func(t *gtest.T) {
err := gtcp.Send(invalidAddr, sendData, gtcp.Retry{Count: 1})
t.AssertNE(err, nil)
})
gtest.C(t, func(t *gtest.T) {
err := gtcp.Send(addr, sendData, gtcp.Retry{Count: 1})
t.AssertNil(err)
})
}
func TestSendRecv(t *testing.T) {
addr := getFreePortAddr()
startTCPServer(addr)
gtest.C(t, func(t *gtest.T) {
recv, err := gtcp.SendRecv(invalidAddr, sendData, -1)
t.AssertNE(err, nil)
t.Assert(recv, nil)
})
gtest.C(t, func(t *gtest.T) {
recv, err := gtcp.SendRecv(addr, sendData, -1)
t.AssertNil(err)
t.Assert(recv, sendData)
})
}
func TestSendWithTimeout(t *testing.T) {
addr := getFreePortAddr()
startTCPServer(addr)
time.Sleep(simpleTimeout)
gtest.C(t, func(t *gtest.T) {
err := gtcp.SendWithTimeout(invalidAddr, sendData, time.Millisecond*500)
t.AssertNE(err, nil)
err = gtcp.SendWithTimeout(addr, sendData, time.Millisecond*500)
t.AssertNil(err)
})
}
func TestSendRecvWithTimeout(t *testing.T) {
addr := getFreePortAddr()
startTCPServer(addr)
time.Sleep(simpleTimeout)
gtest.C(t, func(t *gtest.T) {
recv, err := gtcp.SendRecvWithTimeout(invalidAddr, sendData, -1, time.Millisecond*500)
t.AssertNil(recv)
t.AssertNE(err, nil)
recv, err = gtcp.SendRecvWithTimeout(addr, sendData, -1, time.Millisecond*500)
t.AssertNil(err)
t.Assert(recv, sendData)
})
}
func TestSendPkg(t *testing.T) {
addr := getFreePortAddr()
startTCPPkgServer(addr)
time.Sleep(simpleTimeout)
gtest.C(t, func(t *gtest.T) {
err := gtcp.SendPkg(addr, sendData)
t.AssertNil(err)
err = gtcp.SendPkg(invalidAddr, sendData)
t.AssertNE(err, nil)
})
gtest.C(t, func(t *gtest.T) {
err := gtcp.SendPkg(addr, sendData, gtcp.PkgOption{Retry: gtcp.Retry{Count: 3}})
t.AssertNil(err)
err = gtcp.SendPkg(addr, sendData)
t.AssertNil(err)
})
}
func TestSendRecvPkg(t *testing.T) {
addr := getFreePortAddr()
startTCPPkgServer(addr)
time.Sleep(simpleTimeout)
gtest.C(t, func(t *gtest.T) {
err := gtcp.SendPkg(addr, sendData)
t.AssertNil(err)
_, err = gtcp.SendRecvPkg(invalidAddr, sendData)
t.AssertNE(err, nil)
})
gtest.C(t, func(t *gtest.T) {
err := gtcp.SendPkg(addr, sendData)
t.AssertNil(err)
recv, err := gtcp.SendRecvPkg(addr, sendData)
t.AssertNil(err)
t.Assert(recv, sendData)
})
}
func TestSendPkgWithTimeout(t *testing.T) {
addr := getFreePortAddr()
startTCPPkgServer(addr)
time.Sleep(simpleTimeout)
gtest.C(t, func(t *gtest.T) {
err := gtcp.SendPkg(addr, sendData)
t.AssertNil(err)
err = gtcp.SendPkgWithTimeout(invalidAddr, sendData, time.Second)
t.AssertNE(err, nil)
})
gtest.C(t, func(t *gtest.T) {
err := gtcp.SendPkg(addr, sendData)
t.AssertNil(err)
err = gtcp.SendPkgWithTimeout(addr, sendData, time.Second)
t.AssertNil(err)
})
}
func TestSendRecvPkgWithTimeout(t *testing.T) {
addr := getFreePortAddr()
startTCPPkgServer(addr)
time.Sleep(simpleTimeout)
gtest.C(t, func(t *gtest.T) {
err := gtcp.SendPkg(addr, sendData)
t.AssertNil(err)
_, err = gtcp.SendRecvPkgWithTimeout(invalidAddr, sendData, time.Second)
t.AssertNE(err, nil)
})
gtest.C(t, func(t *gtest.T) {
err := gtcp.SendPkg(addr, sendData)
t.AssertNil(err)
recv, err := gtcp.SendRecvPkgWithTimeout(addr, sendData, time.Second)
t.AssertNil(err)
t.Assert(recv, sendData)
})
}
func TestNewServer(t *testing.T) {
addr := getFreePortAddr()
gtest.C(t, func(t *gtest.T) {
s := gtcp.NewServer(addr, func(conn *gtcp.Conn) {
defer conn.Close()
for {
data, err := conn.Recv(-1)
if err != nil {
break
}
conn.Send(data)
}
}, "NewServer")
defer s.Close()
go s.Run()
time.Sleep(simpleTimeout)
recv, err := gtcp.SendRecv(addr, sendData, -1)
t.AssertNil(err)
t.Assert(recv, sendData)
})
}
func TestGetServer(t *testing.T) {
addr := getFreePortAddr()
gtest.C(t, func(t *gtest.T) {
s := gtcp.GetServer("GetServer")
defer s.Close()
go s.Run()
t.Assert(s.GetAddress(), "")
})
gtest.C(t, func(t *gtest.T) {
gtcp.NewServer(addr, func(conn *gtcp.Conn) {
defer conn.Close()
for {
data, err := conn.Recv(-1)
if err != nil {
break
}
conn.Send(data)
}
}, "NewServer")
s := gtcp.GetServer("NewServer")
defer s.Close()
go s.Run()
time.Sleep(simpleTimeout)
recv, err := gtcp.SendRecv(addr, sendData, -1)
t.AssertNil(err)
t.Assert(recv, sendData)
})
}
func TestServer_SetAddress(t *testing.T) {
addr := getFreePortAddr()
gtest.C(t, func(t *gtest.T) {
s := gtcp.NewServer("", func(conn *gtcp.Conn) {
defer conn.Close()
for {
data, err := conn.Recv(-1)
if err != nil {
break
}
conn.Send(data)
}
})
defer s.Close()
t.Assert(s.GetAddress(), "")
s.SetAddress(addr)
go s.Run()
time.Sleep(simpleTimeout)
recv, err := gtcp.SendRecv(addr, sendData, -1)
t.AssertNil(err)
t.Assert(recv, sendData)
})
}
func TestServer_SetHandler(t *testing.T) {
addr := getFreePortAddr()
gtest.C(t, func(t *gtest.T) {
s := gtcp.NewServer(addr, nil)
defer s.Close()
s.SetHandler(func(conn *gtcp.Conn) {
defer conn.Close()
for {
data, err := conn.Recv(-1)
if err != nil {
break
}
conn.Send(data)
}
})
go s.Run()
time.Sleep(simpleTimeout)
recv, err := gtcp.SendRecv(addr, sendData, -1)
t.AssertNil(err)
t.Assert(recv, sendData)
})
}
func TestServer_Run(t *testing.T) {
addr := getFreePortAddr()
gtest.C(t, func(t *gtest.T) {
s := gtcp.NewServer(addr, func(conn *gtcp.Conn) {
defer conn.Close()
for {
data, err := conn.Recv(-1)
if err != nil {
break
}
conn.Send(data)
}
})
defer s.Close()
go s.Run()
time.Sleep(simpleTimeout)
recv, err := gtcp.SendRecv(addr, sendData, -1)
t.AssertNil(err)
t.Assert(recv, sendData)
})
gtest.C(t, func(t *gtest.T) {
s := gtcp.NewServer(addr, nil)
defer s.Close()
go func() {
err := s.Run()
t.AssertNE(err, nil)
}()
})
}

0
net/gtcp/testdata/crtFile vendored Normal file
View File

0
net/gtcp/testdata/keyFile vendored Normal file
View File

20
net/gtcp/testdata/server.crt vendored Normal file
View File

@ -0,0 +1,20 @@
-----BEGIN CERTIFICATE-----
MIIDVzCCAj+gAwIBAgIJAPRQQvW4UaTJMA0GCSqGSIb3DQEBCwUAMEIxCzAJBgNV
BAYTAlhYMRUwEwYDVQQHDAxEZWZhdWx0IENpdHkxHDAaBgNVBAoME0RlZmF1bHQg
Q29tcGFueSBMdGQwHhcNMTcxMTA2MDMwNjUzWhcNMjcxMTA0MDMwNjUzWjBCMQsw
CQYDVQQGEwJYWDEVMBMGA1UEBwwMRGVmYXVsdCBDaXR5MRwwGgYDVQQKDBNEZWZh
dWx0IENvbXBhbnkgTHRkMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA
rvm9LVnIIPlimBCiNzhLmKqe8soWN7ZND+cN8myD8mcGVZblp01JZbR4n1btEekU
rl3oNr/6aXhLml4ijre150Z73q31XMarlgBtbkbs4Lu22rlLZg/u2hzs9f1aF1VT
qXzru+2ifcYR15Ptoyr8t12dYSQ9YXP7LwzghE9oWw52w0LxlNL0cNq2muSMTelQ
xBU3OuAOdy7dPhiHvkpCCZ5SmwZuK8IpSX0/pJUgDkmd3zfKaaOE4JdLKJ5lWsGF
RgM8leygKfvW4hwguEh7S1UG9CT/6jqPpyiPii3Qc4dxrogmiTPlFpYWY8bFNa9s
iuwr8KFPPZIIwxZgDLAvywIDAQABo1AwTjAdBgNVHQ4EFgQUMsBb4Dhl4OZl+xw8
Pl2wkRhUVi0wHwYDVR0jBBgwFoAUMsBb4Dhl4OZl+xw8Pl2wkRhUVi0wDAYDVR0T
BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEAQEaUz59HZHbPt4Etv4zASn3mFJeR
QZHmUnKhVjB163xvHoN46GJmc4VnWahOd1a7i7b+qK6AnFzKI5zmZ4z5ZrjwqZiG
epvAQ4FVbZy1nzMjBXQIyAkiDgbdjASvOUoE4OlKA3jLH7H204K3jhpaFTKVQNeY
BGEALlKdveQUjlp5YTk38NrrZg0yzGDBUQ6X6PCYB+kdEOOpyx6061jxgIVKuBaY
37I88vGcC9C3PVhYvDcilMkEcUPnp7DRMiZpXU7DraCWlWbr/b+47NkTPBWiNiLC
nlfGdCGuL0ylZ16nEpkvZVUWiAijh3sUYbz1dbBACw+8dTG/+vlKUuz/hA==
-----END CERTIFICATE-----

27
net/gtcp/testdata/server.key vendored Normal file
View File

@ -0,0 +1,27 @@
-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEArvm9LVnIIPlimBCiNzhLmKqe8soWN7ZND+cN8myD8mcGVZbl
p01JZbR4n1btEekUrl3oNr/6aXhLml4ijre150Z73q31XMarlgBtbkbs4Lu22rlL
Zg/u2hzs9f1aF1VTqXzru+2ifcYR15Ptoyr8t12dYSQ9YXP7LwzghE9oWw52w0Lx
lNL0cNq2muSMTelQxBU3OuAOdy7dPhiHvkpCCZ5SmwZuK8IpSX0/pJUgDkmd3zfK
aaOE4JdLKJ5lWsGFRgM8leygKfvW4hwguEh7S1UG9CT/6jqPpyiPii3Qc4dxrogm
iTPlFpYWY8bFNa9siuwr8KFPPZIIwxZgDLAvywIDAQABAoIBAQCRYfXaWY/cPfm6
qY9u3DqLpbCdwGWHctRC01MWSy2y2gE8Wj2ErcW/WJ0kn4Ao8oX5fxMzcn2o5ofC
wlZqSKA+gqTnV5jXtkbZQo+qIgotjCqZP34zVie6WHBWz2PsoTv7Rk1D/2WUpV8r
xMCdY1lJLeJW1Vqev1REOqnNpYDqrhBsCCNn0vvCOS+/UbTbJ2d4sw3BuqGfd2Uk
eIXSlwkODKf2Tk3b4tktC7I0XZfBeO1DEpBJAYP+zPTt/we/Kne6FI/squdephJL
JMj30bSZ0jpgP/K6otEiE3pfdzijTFPjw8ayU1yuZZMSRLJtFKbSfSNGUfXVHwZP
6ygv91DJAoGBAOIawxKzSVJxz6yvaxh2Zxnib33TmpyWcDVKje/bk88hxEXm7C3Q
OPMGbfy37mc6jDoH2erv2GFDFRCezHKS+OEN5heZnL3m/c6E0A4K/V9VUDSnABLi
jmDRw45mDZq9edGxkvydHYMdJhH+hbbWrxr8LQtsBLuaDzLEkHa8cscdAoGBAMYc
Wd4x3fBCA2/Xd98+ZTpYhtbYDvIYl2gfVLSiLuvf3ZgnWozibCOJg5DVh/0vCS+G
ct4Ga3e17qRXZOXuSoZdBIh7nV2mQ0+zc+4ZE7UE0cAU4KYkGBabt1J4HdIxCOUB
60smideKfFKurh5OCxSP76tIwOhcSXpduhmb/VYHAoGAfe7V89Zz4j2No+rYRXm9
FwetfXGcTdbkjGoIAC5WdymhfiWOKj4tWf6cyANR/6D2dWPmFhqcdB++3dD0omQF
xqPNIhvm10aO2rXSg9/PG4gS8iCJw/r3vilXODrTHPqnnQnAin6f72UOzTrsEtgk
E22dUR1KzYqTKH2e0ONJMmkCgYBlcFzftd7zR4nk+YoKiDNi9bNNTOISOl9EVE6W
Ezk9U6puXzAxVTqT07THM17nV+83I3urjdP3PvPLuGgUh7gnJnfMvqbsLdbnd3aT
4slBdg9EcCw7Rd4DrYXnt1Nlre/k+t+U4k3QTLutxn2nTMTFqZHJvX3xPFfvTRCe
Tk4gfwKBgDDo8/NvOZQJi+A5qJFooWkm5mFjsq2RTuOE5dZlgfNp3FzbJ1wcC0X5
ifOWAMGIyw0m68Q07fL2rsfvfB69iB6oRv6WCuUXH2f5THgUeVxxYHHUfGJQQkcu
XJXnZDH/OB1Pg674BzC6dGsHDM19kgWmr0aVQK4jueqxsm5pchEr
-----END RSA PRIVATE KEY-----