func (f *HttpFile) ReadAt(p []byte, off int64) (int, error) {
	DebugLog(f.Debug).Println("ReadAt", off, len(p))

	if f.client == nil {
		return 0, os.ErrInvalid
	}

	plen := len(p)
	if plen <= 0 {
		return plen, nil
	}

	bytes_range := fmt.Sprintf("bytes=%d-%d", off, off+int64(plen-1))
	resp, err := f.do("GET", headers{"Range": bytes_range})
	defer CloseResponse(resp)

	if err != nil {
		DebugLog(f.Debug).Println("ReadAt error", err)
		return 0, &HttpFileError{Err: err}
	}
	if resp.StatusCode == http.StatusRequestedRangeNotSatisfiable {
		return 0, io.EOF
	}
	if resp.StatusCode != http.StatusPartialContent {
		return 0, &HttpFileError{Err: fmt.Errorf("Unexpected Status %s", resp.Status)}
	}

	content_range := resp.Header.Get("Content-Range")

	var first, last, total int64
	n, err := fmt.Sscanf(content_range, "bytes %d-%d/%d", &first, &last, &total)
	if err != nil {
		DebugLog(f.Debug).Println("Error", err)
		return 0, err
	}
	if n != 3 {
		return 0, &HttpFileError{Err: fmt.Errorf("Unexpected Content-Range %q (%d)", content_range, n)}
	}

	DebugLog(f.Debug).Println("Range", bytes_range, "Content-Range", content_range)

	n, err = io.ReadFull(resp.Body, p)
	if n > 0 && err == io.EOF {
		// read reached EOF, but archive/zip doesn't like this!
		DebugLog(f.Debug).Println("Read", n, "reached EOF")
		err = nil
	}

	DebugLog(f.Debug).Println("Read", n, err)
	return n, err
}