name is '/'-separated, not filepath.Separator.
( logger termlog.Logger, w http.ResponseWriter, r *http.Request, name string, redirect bool, )
| 440 | |
| 441 | // name is '/'-separated, not filepath.Separator. |
| 442 | func (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() { |