HTTP-ответ IPFS иногда получал ошибку EOF с правильным телом - PullRequest
0 голосов
/ 06 августа 2020

Когда я отлаживаю следующий код , иногда он может правильно читать данные из тела, но с ошибкой EOF .

func (r *trailerReader) Read(b []byte) (int, error) {
    n, err := r.resp.Body.Read(b)
    if err != nil {
        if e := r.resp.Trailer.Get("X-Stream-Error"); e != "" {
            err = errors.New(e)
        }
    }
    return n, err
}

Я позвонил этот метод в моем коде:

// FilesRead read a file in a given MFS
func (s *Shell) FilesRead(ctx context.Context, path string, options ...FilesOpt) (io.ReadCloser, error) {
    rb := s.Request("files/read", path)
    for _, opt := range options {
        if err := opt(rb); err != nil {
            return nil, err
        }
    }

    resp, err := rb.Send(ctx)
    if err != nil {
        return nil, err
    }
    if resp.Error != nil {
        return nil, resp.Error
    }

    return resp.Output, nil
}

Есть мысли?

1 Ответ

0 голосов
/ 10 августа 2020

Как сказал Стебалиен в этом выпуске Github , это go ожидаемое поведение Reader.

См. Третий абзац этой документации

Когда Read обнаруживает ошибку или условие конца файла после успешного чтения n> 0 байтов, оно возвращает количество прочитанных байтов. Он может вернуть ошибку (отличную от nil) из того же вызова или вернуть ошибку (и n == 0) из последующего вызова. Примером этого общего случая является то, что Reader, возвращающий ненулевое количество байтов в конце входного потока, может возвращать либо err == EOF, либо err == nil. Следующее чтение должно вернуть 0, EOF.

...