@@ -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
2624var hash , dst string
2725var verify bool
2826var version bool
2927
3028func 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