PostStr string
Timeout int
ReadTimeout int
+ ConnectTimeout int
Proxy string
Retry int
SleepTime int
_val := val;
- if _val.Timeout==0{_val.Timeout=3}
+ if _val.Timeout==0{_val.Timeout=3000}
defer func(){
this.idp.Put(this.id)
this.cancel = signal.Init()
- for ;_val.Retry>=0;_val.Retry-- {
+ for SleepTime,Retry:=_val.SleepTime,_val.Retry;Retry>=0;Retry-=1 {
returnErr=this.Reqf_1(_val)
select {
case <- this.cancel.WaitC()://cancel
default:
if returnErr==nil {return nil}
}
- time.Sleep(time.Duration(_val.SleepTime)*time.Millisecond)
+ time.Sleep(time.Duration(SleepTime)*time.Millisecond)
}
return returnErr
}
-func (this *Req) Reqf_1(val Rval) (error) {
+func (this *Req) Reqf_1(val Rval) (err error) {
var (
Url string = val.Url
Proxy string = val.Proxy
Timeout int = val.Timeout
ReadTimeout int = val.ReadTimeout
+ ConnectTimeout int = val.ConnectTimeout
JustResponseCode bool = val.JustResponseCode
SaveToChan chan[]byte = val.SaveToChan
SaveToPath string = val.SaveToPath
cx, cancel := context.WithCancel(context.Background())
if Timeout != -1 {
- cx, _ = context.WithTimeout(cx,time.Duration(Timeout)*time.Second)
+ cx, _ = context.WithTimeout(cx,time.Duration(Timeout)*time.Millisecond)
}
req,_ := http.NewRequest(Method, Url, body)
req = req.WithContext(cx)
rc,_ := pio.RW2Chan(resp.Body,nil)
var After = func(ReadTimeout int) (c <-chan time.Time) {
if ReadTimeout > 0 {
- c = time.NewTimer(time.Second*time.Duration(ReadTimeout)).C
+ c = time.NewTimer(time.Millisecond*time.Duration(ReadTimeout)).C
}
return
}
- for {
+ select {
+ case buf :=<- rc:
+ if len(buf) != 0 {
+ if SaveToChan != nil {
+ SaveToChan <- buf
+ } else if SaveToPipeWriter != nil {
+ SaveToPipeWriter.Write(buf)
+ } else {
+ this.Respon = append(this.Respon,buf...)
+ }
+ } else {
+ err = io.EOF
+ return
+ }
+ case <-After(ConnectTimeout):
+ err = context.DeadlineExceeded
+ return
+ }
+
+ for loop:=true;loop; {
select {
case buf :=<- rc:
if len(buf) != 0 {
this.Respon = append(this.Respon,buf...)
}
} else {
- if SaveToChan != nil {
- close(SaveToChan)
- }
- if SaveToPipeWriter != nil {
- SaveToPipeWriter.Close()
- }
- return nil
+ err = io.EOF
+ loop = false
+ break
}
case <-After(ReadTimeout):
- if SaveToChan != nil {
- close(SaveToChan)
- }
- if SaveToPipeWriter != nil {
- SaveToPipeWriter.Close()
- }
- return context.DeadlineExceeded
+ err = context.DeadlineExceeded
+ loop = false
+ break
}
if !this.cancel.Islive() {
- if SaveToChan != nil {
- close(SaveToChan)
- }
- if SaveToPipeWriter != nil {
- SaveToPipeWriter.Close()
- }
- return context.Canceled
+ err = context.Canceled
+ loop = false
+ break
}
}
+ if SaveToChan != nil {
+ close(SaveToChan)
+ }
+ if SaveToPipeWriter != nil {
+ SaveToPipeWriter.Close()
+ }
}
}
} else {resp.Body.Close()}
go func(){
defer func(){
- close(o.RecvChan)
o.signal.Done()
+ close(o.RecvChan)
}()
tmp_Header := make(http.Header)
if err != nil {return}
defer c.Close()
- done := make(chan struct{})
+ done := s.Init()
+ defer done.Done()
go func() {
- defer close(done)
+ defer done.Done()
for {
c.SetReadDeadline(time.Now().Add(time.Millisecond*time.Duration(o.TO)))
}
return
}
+ if !done.Islive() {return}
switch msg_type {
case websocket.PingMessage:
o.SendChan <- ws_msg{
for {
select {
- case <- done:
- return
+ case <- done.WaitC():return
case t := <- o.SendChan:
+ if !done.Islive() {return}
+
var err error
switch reflect.ValueOf(t).Type().Name() {
case `ws_msg`:
return
}
c.SetWriteDeadline(time.Now().Add(time.Millisecond*time.Duration(o.TO)))
- case <- o.signal.Chan:
+ case <- o.signal.WaitC():
+ if !done.Islive() {return}
+
err := c.WriteMessage(websocket.CloseMessage, websocket.FormatCloseMessage(websocket.CloseNormalClosure, o.Msg_normal_close))
if err != nil {o.err = err}
select {
- case <- done:
+ case <- done.WaitC():
case <- time.After(time.Second):
}
return