Skip to content

Commit dc31c2f

Browse files
committed
add timeout and redo logic
1 parent 6674ecd commit dc31c2f

File tree

3 files changed

+36
-20
lines changed

3 files changed

+36
-20
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,4 +30,4 @@ fileload -v xx.zip
3030

3131

3232

33-
![ScreenShot](cli.png)
33+
![ScreenShot](fileload.png)

fileload.png

210 KB
Loading

main.go

Lines changed: 35 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -17,19 +17,18 @@ import (
1717
"time"
1818
)
1919

20-
const VERSION = "1.0.0"
20+
const VERSION = "1.0.1"
2121

22-
const DefaultBuff = 1000 * 1000 * 10 //10M
23-
24-
var queue, finish chan int
25-
var cor, size, length int
22+
var queue, redo, finish chan int
23+
var cor, size, length, timeout int
2624
var hash, dst string
2725
var verify bool
2826
var version bool
2927

3028
func main() {
3129
flag.IntVar(&cor, "c", 1, "coroutine num")
3230
flag.IntVar(&size, "s", 0, "buff length")
31+
flag.IntVar(&size, "t", 0, "timeout")
3332
flag.StringVar(&dst, "f", "file", "file name")
3433
flag.StringVar(&hash, "h", "sha1", "sha1 or md5 to verify the file")
3534
flag.BoolVar(&verify, "v", false, "verify file, not download")
@@ -84,14 +83,20 @@ func main() {
8483
}
8584
fragment := int(math.Ceil(float64(length) / float64(size)))
8685
queue = make(chan int, cor)
86+
redo = make(chan int, int(math.Floor(float64(cor)/2)))
8787
go func() {
8888
for i := 0; i < fragment; i++ {
89+
select {
90+
case j := <-redo:
91+
queue <- j
92+
default:
93+
}
8994
queue <- i
9095
}
9196
}()
9297
finish = make(chan int, cor)
9398
for j := 0; j < cor; j++ {
94-
go Do(request, fragment)
99+
go Do(request, fragment, j)
95100
}
96101
for k := 0; k < fragment; k++ {
97102
<-finish
@@ -134,16 +139,17 @@ func main() {
134139
log.Printf("Time:%f\n", finishTime.Sub(startTime).Seconds())
135140
}
136141

137-
func Do(request *http.Request, fragment int) {
142+
func Do(request *http.Request, fragment, no int) {
138143
var req http.Request
139144
err := DeepCopy(&req, request)
140145
if err != nil {
141-
log.Println(err)
146+
log.Println("ERROR|prepare request:", err)
147+
log.Panic(err)
142148
return
143149
}
144150
for {
145151
i := <-queue
146-
log.Printf("[%d]Start download\n", i)
152+
//log.Printf("[%d][%d]Start download\n",no, i)
147153
start := i * size
148154
var end int
149155
if i < fragment-1 {
@@ -152,28 +158,38 @@ func Do(request *http.Request, fragment int) {
152158
end = length - 1
153159
}
154160
req.Header.Set("Range", fmt.Sprintf("bytes=%d-%d", start, end))
155-
log.Printf("[%d]Start range:%d-%d\n", i, start, end)
156-
cli := http.Client{}
161+
log.Printf("[%d][%d]Start download:%d-%d\n", no, i, start, end)
162+
cli := http.Client{
163+
Timeout: time.Duration(timeout) * time.Second,
164+
}
157165
resp, err := cli.Do(&req)
158166
if err != nil {
159-
log.Println(err)
160-
return
167+
log.Printf("[%d][%d]ERROR|do request:%s\n", no, i, err.Error())
168+
redo <- i
169+
continue
161170
}
162171

163172
//log.Printf("[%d]Content-Length:%s\n", i, resp.Header.Get("Content-Length"))
164-
log.Printf("[%d]Content-Range:%s\n", i, resp.Header.Get("Content-Range"))
173+
log.Printf("[%d][%d]Content-Range:%s\n", no, i, resp.Header.Get("Content-Range"))
165174

166175
file, err := os.Create(fmt.Sprintf("tmp_%d", i))
167176
if err != nil {
168-
log.Println(err)
169-
return
177+
log.Printf("[%d][%d]ERROR|create file:%s\n", no, i, err.Error())
178+
file.Close()
179+
resp.Body.Close()
180+
redo <- i
181+
continue
170182
}
183+
log.Printf("[%d][%d]Writing to file...\n", no, i)
171184
n, err := io.Copy(file, resp.Body)
172185
if err != nil {
173-
log.Println(err)
174-
return
186+
log.Printf("[%d][%d]ERROR|write to file:%s\n", no, i, err.Error())
187+
file.Close()
188+
resp.Body.Close()
189+
redo <- i
190+
continue
175191
}
176-
log.Printf("[%d]Writing to file:%d\n", i, n)
192+
log.Printf("[%d][%d]Wrote successfully:%d\n", no, i, n)
177193

178194
file.Close()
179195
resp.Body.Close()

0 commit comments

Comments
 (0)