MCPcopy
hub / github.com/nats-io/nats.go / Read

Method Read

object.go:1265–1321  ·  view source on GitHub ↗

Read impl.

(p []byte)

Source from the content-addressed store, hash-verified

1263
1264// Read impl.
1265func (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

Callers 1

PutMethod · 0.45

Calls 7

SetReadDeadlineMethod · 0.80
EqualMethod · 0.80
DecodeObjectDigestFunction · 0.70
AddMethod · 0.65
DoneMethod · 0.65
ErrMethod · 0.65
TimeoutMethod · 0.65

Tested by

no test coverage detected