Read impl.
(p []byte)
| 1263 | |
| 1264 | // Read impl. |
| 1265 | func (o *objResult) Read(p []byte) (n int, err error) { |
| 1266 | o.Lock() |
| 1267 | defer o.Unlock() |
| 1268 | readDeadline := time.Now().Add(o.readTimeout) |
| 1269 | if ctx := o.ctx; ctx != nil { |
| 1270 | if deadline, ok := ctx.Deadline(); ok { |
| 1271 | readDeadline = deadline |
| 1272 | } |
| 1273 | select { |
| 1274 | case <-ctx.Done(): |
| 1275 | if ctx.Err() == context.Canceled { |
| 1276 | o.err = ctx.Err() |
| 1277 | } else { |
| 1278 | o.err = ErrTimeout |
| 1279 | } |
| 1280 | default: |
| 1281 | } |
| 1282 | } |
| 1283 | if o.err != nil { |
| 1284 | return 0, o.err |
| 1285 | } |
| 1286 | if o.r == nil { |
| 1287 | return 0, io.EOF |
| 1288 | } |
| 1289 | |
| 1290 | r := o.r.(net.Conn) |
| 1291 | r.SetReadDeadline(readDeadline) |
| 1292 | n, err = r.Read(p) |
| 1293 | if err, ok := err.(net.Error); ok && err.Timeout() { |
| 1294 | if ctx := o.ctx; ctx != nil { |
| 1295 | select { |
| 1296 | case <-ctx.Done(): |
| 1297 | if ctx.Err() == context.Canceled { |
| 1298 | return 0, ctx.Err() |
| 1299 | } else { |
| 1300 | return 0, ErrTimeout |
| 1301 | } |
| 1302 | default: |
| 1303 | err = nil |
| 1304 | } |
| 1305 | } |
| 1306 | } |
| 1307 | if err == io.EOF { |
| 1308 | // Make sure the digest matches. |
| 1309 | sha := o.digest.Sum(nil) |
| 1310 | rsha, decodeErr := DecodeObjectDigest(o.info.Digest) |
| 1311 | if decodeErr != nil { |
| 1312 | o.err = decodeErr |
| 1313 | return 0, o.err |
| 1314 | } |
| 1315 | if !bytes.Equal(sha[:], rsha) { |
| 1316 | o.err = ErrDigestMismatch |
| 1317 | return 0, o.err |
| 1318 | } |
| 1319 | } |
| 1320 | return n, err |
| 1321 | } |
| 1322 |
no test coverage detected