running *signal.Signal
responBuf *bytes.Buffer
responFile *os.File
+ asyncErr error
}
func New() *Req {
// }
func (t *Req) Reqf(val Rval) error {
+
if val.SaveToChan != nil && len(val.SaveToChan) == 1 && !val.Async {
panic("must make sure chan size larger then 1 or use Async true")
}
t.Respon = []byte{}
t.Response = nil
t.UsedTime = 0
+ t.cancel = signal.Init()
+ t.running = signal.Init()
var returnErr error
time.Sleep(time.Duration(SleepTime) * time.Millisecond)
}
+ if !val.Async || returnErr != nil {
+ t.asyncErr = returnErr
+ if val.SaveToChan != nil {
+ close(val.SaveToChan)
+ }
+ if t.responFile != nil {
+ t.responFile.Close()
+ }
+ if val.SaveToPipeWriter != nil {
+ val.SaveToPipeWriter.Close()
+ }
+ if t.responBuf != nil {
+ t.Respon = t.responBuf.Bytes()
+ }
+ t.running.Done()
+ t.cancel.Done()
+ }
return returnErr
}
if val.Timeout > 0 {
cx, cancel = context.WithTimeout(cx, time.Duration(val.Timeout)*time.Millisecond)
}
- req, e := http.NewRequest(Method, val.Url, body)
- if e != nil {
- panic(e)
- }
- req = req.WithContext(cx)
- var done = make(chan struct{})
- defer close(done)
go func() {
select {
case <-t.cancel.WaitC():
cancel()
- case <-done:
+ case <-t.running.WaitC():
}
}()
+ req, e := http.NewRequest(Method, val.Url, body)
+ if e != nil {
+ panic(e)
+ }
+ req = req.WithContext(cx)
+
for _, v := range val.Cookies {
req.AddCookie(v)
}
resReader = resp.Body
}
- t.running = signal.Init()
- t.cancel = signal.Init()
go func() {
buf := make([]byte, 512)
+
for {
if n, e := resReader.Read(buf); n != 0 {
w.Write(buf[:n])
break
}
}
+
+ if val.Async {
+ t.asyncErr = err
+ }
resp.Body.Close()
if val.SaveToChan != nil {
close(val.SaveToChan)
if t.responBuf != nil {
t.Respon = t.responBuf.Bytes()
}
- t.cancel.Done()
t.running.Done()
}()
if !val.Async {
return
}
-func (t *Req) Wait() {
+func (t *Req) Wait() error {
t.running.Wait()
+ return t.asyncErr
}
func (t *Req) Cancel() { t.Close() }
if !bytes.Equal(r.Respon, []byte("abc强强强强")) {
t.Error("flate fail")
}
+ {
+ e := r.Reqf(Rval{
+ Url: "http://" + addr + "/to",
+ Timeout: 1000,
+ })
+ if !IsTimeout(e) {
+ t.Error("Timeout fail")
+ }
+ }
+ {
+ r.Reqf(Rval{
+ Url: "http://" + addr + "/to",
+ Timeout: 1000,
+ Async: true,
+ })
+ if !IsTimeout(r.Wait()) {
+ t.Error("Async Timeout fail")
+ }
+ }
+ {
+ c := make(chan []byte)
+ r.Reqf(Rval{
+ Url: "http://" + addr + "/to",
+ Timeout: 1000,
+ Async: true,
+ SaveToChan: c,
+ })
+ for {
+ buf := <-c
+ if len(buf) == 0 {
+ break
+ }
+ }
+ if !IsTimeout(r.Wait()) {
+ t.Error("async cancel fail")
+ }
+ }
{
c := make(chan []byte)
r.Reqf(Rval{
t.Error("chan fail")
}
}
- {
- e := r.Reqf(Rval{
- Url: "http://" + addr + "/to",
- Timeout: 1000,
- })
- if !IsTimeout(e) {
- t.Error("Timeout fail")
- }
- }
{
timer := time.NewTimer(time.Second)
go func() {