MCPcopy Index your code
hub / github.com/cortesi/devd / serveFile

Method serveFile

fileserver/fileserver.go:442–527  ·  view source on GitHub ↗

name is '/'-separated, not filepath.Separator.

(
	logger termlog.Logger,
	w http.ResponseWriter,
	r *http.Request,
	name string,
	redirect bool,
)

Source from the content-addressed store, hash-verified

440
441// name is '/'-separated, not filepath.Separator.
442func (fserver *FileServer) serveFile(
443 logger termlog.Logger,
444 w http.ResponseWriter,
445 r *http.Request,
446 name string,
447 redirect bool,
448) {
449 const indexPage = "/index.html"
450
451 // redirect .../index.html to .../
452 // can't use Redirect() because that would make the path absolute,
453 // which would be a problem running under StripPrefix
454 if strings.HasSuffix(r.URL.Path, indexPage) {
455 logger.SayAs(
456 "debug", "debug fileserver: redirecting %s -> ./", indexPage,
457 )
458 localRedirect(w, r, "./")
459 return
460 }
461
462 f, err := fserver.Root.Open(name)
463 if err != nil {
464 logger.WarnAs("debug", "debug fileserver: %s", err)
465 if err := fserver.notFound(logger, w, r, name, nil); err != nil {
466 logger.Shout("Internal error: %s", err)
467 }
468 return
469 }
470 defer func() { _ = f.Close() }()
471
472 d, err1 := f.Stat()
473 if err1 != nil {
474 logger.WarnAs("debug", "debug fileserver: %s", err)
475 if err := fserver.notFound(logger, w, r, name, nil); err != nil {
476 logger.Shout("Internal error: %s", err)
477 }
478 return
479 }
480
481 if redirect {
482 // redirect to canonical path: / at end of directory url
483 url := r.URL.Path
484 if !strings.HasPrefix(url, "/") {
485 url = "/" + url
486 }
487 if d.IsDir() {
488 if url[len(url)-1] != '/' {
489 localRedirect(w, r, path.Base(url)+"/")
490 return
491 }
492 } else if url[len(url)-1] == '/' {
493 localRedirect(w, r, "../"+path.Base(url))
494 return
495 }
496 }
497
498 // use contents of index.html for directory, if present
499 if d.IsDir() {

Callers 2

ServeFileFunction · 0.95
ServeHTTPContextMethod · 0.95

Calls 10

notFoundMethod · 0.95
localRedirectFunction · 0.85
serveContentFunction · 0.85
StatMethod · 0.80
IsDirMethod · 0.80
SizeMethod · 0.80
NameMethod · 0.80
ModTimeMethod · 0.80
OpenMethod · 0.45
CloseMethod · 0.45

Tested by 1

ServeFileFunction · 0.76