Skip to content

Commit

Permalink
Merge pull request #237 from 0pcom/proxified-basic-example
Browse files Browse the repository at this point in the history
dmsg client using socks5 proxy basic example
  • Loading branch information
0pcom authored Dec 9, 2023
2 parents 65d707c + d4a047b commit 528bcb6
Showing 1 changed file with 126 additions and 0 deletions.
126 changes: 126 additions & 0 deletions examples/proxified/main.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,126 @@
package main

import (
"context"

"time"
"net/http"
"github.com/skycoin/skywire-utilities/pkg/skyenv"
"github.com/skycoin/skywire-utilities/pkg/logging"

"github.com/skycoin/skywire-utilities/pkg/cipher"
"github.com/skycoin/dmsg/pkg/disc"
dmsg "github.com/skycoin/dmsg/pkg/dmsg"
"golang.org/x/net/proxy"
)

func main() {
log := logging.MustGetLogger("proxified")

// generate keys for clients
respPK, respSK := cipher.GenerateKeyPair()
initPK, initSK := cipher.GenerateKeyPair()

// ports to listen by clients. can be any free port
var initPort, respPort uint16 = 1563, 1563

// Configure SOCKS5 proxy dialer
proxyAddr := "127.0.0.1:1080" // use skysocks-client skywire proxy address
dialer, err := proxy.SOCKS5("tcp", proxyAddr, nil, proxy.Direct)
if err != nil {
log.Fatalf("Error creating SOCKS5 dialer: %v", err)
}

// Configure custom HTTP transport with SOCKS5 proxy
transport := &http.Transport{
Dial: dialer.Dial,
}

// Configure HTTP client with custom transport
httpClient := &http.Client{
Transport: transport,
}

// instantiate clients with custom config
respC := dmsg.NewClient(respPK, respSK, disc.NewHTTP(skyenv.DmsgDiscAddr, httpClient, log), dmsg.DefaultConfig())
go respC.Serve(context.Background())

initC := dmsg.NewClient(initPK, initSK, disc.NewHTTP(skyenv.DmsgDiscAddr, &http.Client{}, log), dmsg.DefaultConfig())
go initC.Serve(context.Background())

time.Sleep(2 * time.Second)

// bind to port and start listening for incoming messages
initL, err := initC.Listen(initPort)
if err != nil {
log.Fatalf("Error listening by initiator on port %d: %v", initPort, err)
}

// bind to port and start listening for incoming messages
respL, err := respC.Listen(respPort)
if err != nil {
log.Fatalf("Error listening by responder on port %d: %v", respPort, err)
}

initTp, err := initC.DialStream(context.Background(), dmsg.Addr{PK: respPK, Port: respPort})
if err != nil {
log.Fatalf("Error dialing responder: %v", err)
}

respTp, err := respL.AcceptStream()
if err != nil {
log.Fatalf("Error accepting inititator: %v", err)
}

payload := "Hello there!"
_, err = initTp.Write([]byte(payload))
if err != nil {
log.Fatalf("Error writing to initiator's stream: %v", err)
}

recvBuf := make([]byte, len(payload))
_, err = respTp.Read(recvBuf)
if err != nil {
log.Fatalf("Error reading from responder's stream: %v", err)
}

log.Printf("Responder accepted: %s", string(recvBuf))

payload = "General Kenobi"
_, err = respTp.Write([]byte(payload))
if err != nil {
log.Fatalf("Error writing response: %v", err)
}

initRecvBuf := make([]byte, len(payload))
_, err = initTp.Read(initRecvBuf)
if err != nil {
log.Fatalf("Error reading response: %v", err)
}

log.Printf("Initiator accepted: %s", string(initRecvBuf))

if err := initTp.Close(); err != nil {
log.Fatalf("Error closing initiator's stream: %v", err)
}

if err := respTp.Close(); err != nil {
log.Fatalf("Error closing responder's stream: %v", err)
}

if err := initL.Close(); err != nil {
log.Fatalf("Error closing initiator's listener: %v", err)
}

if err := respL.Close(); err != nil {
log.Fatalf("Error closing responder's listener: %v", err)
}

if err := initC.Close(); err != nil {
log.Fatalf("Error closing initiator: %v", err)
}

if err := respC.Close(); err != nil {
log.Fatalf("Error closing responder: %v", err)
}
}

0 comments on commit 528bcb6

Please sign in to comment.