commit e118706dd2fdf7ffdc2acf01f565d204d92be0dd
parent 98b662176e550af675fdc078347424cfd0e69bef
Author: n0tr1v <n0tr1v@protonmail.com>
Date: Mon, 30 Jan 2023 16:22:09 -0800
ensure no failure can happen
Diffstat:
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)
+}