MCPcopy Index your code
hub / github.com/coder/coder / getMetadata

Method getMetadata

site/bin.go:333–392  ·  view source on GitHub ↗
(name string)

Source from the content-addressed store, hash-verified

331}
332
333func (b *binMetadataCache) getMetadata(name string) (binMetadata, error) {
334 b.mut.RLock()
335 metadata, ok := b.metadata[name]
336 b.mut.RUnlock()
337 if ok {
338 return metadata, nil
339 }
340
341 // Avoid DOS by using a pool, and only doing work once per file.
342 v, err, _ := b.sf.Do(name, func() (any, error) {
343 b.sem <- struct{}{}
344 defer func() { <-b.sem }()
345
346 // Reject any invalid or non-basename paths before touching the filesystem.
347 if name == "" ||
348 name == "." ||
349 strings.Contains(name, "/") ||
350 strings.Contains(name, "\\") ||
351 !fs.ValidPath(name) ||
352 path.Base(name) != name {
353 return binMetadata{}, os.ErrNotExist
354 }
355
356 f, err := b.binFS.Open(name)
357 if err != nil {
358 return binMetadata{}, err
359 }
360 defer f.Close()
361
362 var metadata binMetadata
363
364 stat, err := f.Stat()
365 if err != nil {
366 return binMetadata{}, err
367 }
368 metadata.sizeBytes = stat.Size()
369
370 if hash, ok := b.originalHashes[name]; ok {
371 metadata.sha1Hash = hash
372 } else {
373 h := sha1.New() //#nosec // Not used for cryptography.
374 _, err := io.Copy(h, f)
375 if err != nil {
376 return binMetadata{}, err
377 }
378 metadata.sha1Hash = hex.EncodeToString(h.Sum(nil))
379 }
380
381 b.mut.Lock()
382 b.metadata[name] = metadata
383 b.mut.Unlock()
384 return metadata, nil
385 })
386 if err != nil {
387 return binMetadata{}, err
388 }
389
390 //nolint:forcetypeassert

Callers 1

ServeHTTPMethod · 0.80

Calls 9

SizeMethod · 0.80
DoMethod · 0.65
CloseMethod · 0.65
NewMethod · 0.65
CopyMethod · 0.65
ContainsMethod · 0.45
OpenMethod · 0.45
LockMethod · 0.45
UnlockMethod · 0.45

Tested by

no test coverage detected