func rangeFetch(C *RemoteChannel, req *event.HTTPRequestEvent, begin, end int64) (*event.HTTPResponseEvent, error) { log.Printf("Session:%d range fetch %d-%d", req.GetId(), begin, end) rangeReq := new(event.HTTPRequestEvent) rangeReq.Headers = make(http.Header) for k, v := range req.Headers { rangeReq.Headers[k] = v } rangeReq.URL = req.URL rangeReq.Method = req.Method rangeReq.SetId(req.GetId()) rangeReq.Headers.Set("Range", fmt.Sprintf("bytes=%d-%d", begin, end)) ev, err := C.Request(rangeReq) if nil == err { res, ok := ev.(*event.HTTPResponseEvent) if ok { res.SetId(req.GetId()) if res.StatusCode == 302 { location := res.Headers.Get("Location") log.Printf("Range fetch:%s redirect to %s", rangeReq.URL, location) rangeReq.URL = location return rangeFetch(C, rangeReq, begin, end) } if res.StatusCode < 400 { return res, nil } } err = fmt.Errorf("Invalid response:%d %v for range fetch", res.StatusCode, res.Headers) } log.Printf("[ERROR]Failed to range fetch[%d-%d] for %s", begin, end, req.URL) return nil, err }