dkforest

A forum and chat platform (onion)
git clone https://git.dasho.dev/n0tr1v/dkforest.git
Log | Files | Refs | LICENSE

commit e118706dd2fdf7ffdc2acf01f565d204d92be0dd
parent 98b662176e550af675fdc078347424cfd0e69bef
Author: n0tr1v <n0tr1v@protonmail.com>
Date:   Mon, 30 Jan 2023 16:22:09 -0800

ensure no failure can happen

Diffstat:
Mcmd/dkfupload/main.go | 56++++++++++++++++++++++++++++++++++++++++++++------------
1 file changed, 44 insertions(+), 12 deletions(-)

diff --git a/cmd/dkfupload/main.go b/cmd/dkfupload/main.go @@ -2,18 +2,21 @@ package main import ( "context" + "encoding/hex" "flag" "fmt" "github.com/dustin/go-humanize" "golang.org/x/net/proxy" "log" "math" + "math/rand" "net" "net/http" "net/http/cookiejar" "os" "strings" "sync" + "time" ) const ( @@ -72,12 +75,18 @@ func main() { wg.Add(nbThreads) for i := 0; i < nbThreads; i++ { go func(i int, wg *sync.WaitGroup, chunksCh chan int64) { - username := fmt.Sprintf("user_%d", i) - password := username - client, err := GetHttpClient(&proxy.Auth{User: username, Password: password}) - if err != nil { - log.Fatalln(err.Error()) - } + + var client *http.Client + hasToSucceed(func() error { + username := fmt.Sprintf("user_%d", i) + password := GenerateTokenN(8) + client, err = GetHttpClient(&proxy.Auth{User: username, Password: password}) + if err != nil { + return err + } + return nil + }) + buf := make([]byte, maxChunkSize) for chunkNum := range chunksCh { offset := chunkNum * maxChunkSize @@ -85,12 +94,16 @@ func main() { log.Printf("Thread #%03d | chunk #%03d | read %d | from %d to %d\n", i, chunkNum, n, offset, offset+int64(n)) if !dry { // TODO: http post the chunk to server - req, _ := http.NewRequest(http.MethodPost, dkfBaseURL+"/file-drop/"+filedropUUID, nil) - req.Header.Set("User-Agent", userAgent) - req.Header.Set("DKF_API_KEY", apiKey) - _, err := client.Do(req) - if err != nil { - } + hasToSucceed(func() error { + req, _ := http.NewRequest(http.MethodPost, dkfBaseURL+"/file-drop/"+filedropUUID, nil) + req.Header.Set("User-Agent", userAgent) + req.Header.Set("DKF_API_KEY", apiKey) + _, err := client.Do(req) + if err != nil { + return err + } + return nil + }) } } wg.Done() @@ -101,6 +114,18 @@ func main() { log.Printf("All done\n") } +// Will keep retrying a callback until no error is returned +func hasToSucceed(clb func() error) { + for { + err := clb() + if err == nil { + break + } + log.Printf("wait 10 seconds before retry; %v\n", err) + time.Sleep(5 * time.Second) + } +} + // GetHttpClient http client that uses tor proxy func GetHttpClient(auth *proxy.Auth) (*http.Client, error) { dialer, err := proxy.SOCKS5("tcp", torProxyAddr, auth, proxy.Direct) @@ -118,3 +143,10 @@ func GetHttpClient(auth *proxy.Auth) (*http.Client, error) { } return &http.Client{Transport: transport, Jar: jar}, nil } + +// GenerateTokenN generates a random printable string from N bytes +func GenerateTokenN(n int) string { + b := make([]byte, n) + _, _ = rand.Read(b) + return hex.EncodeToString(b) +}