Esempio n. 1
0
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
}