Developer Center website. https://developers.write.as
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

78 lines
1.8 KiB

  1. package main
  2. import (
  3. "code.as/writeas/developers-web/platform"
  4. "fmt"
  5. "github.com/writeas/web-core/log"
  6. "net/http"
  7. "os"
  8. "path/filepath"
  9. "runtime/debug"
  10. "time"
  11. )
  12. func viewPage(w http.ResponseWriter, r *http.Request) {
  13. start := time.Now()
  14. defer func() {
  15. if e := recover(); e != nil {
  16. log.Error("%s: %s", e, debug.Stack())
  17. http.Error(w, "Error", http.StatusInternalServerError)
  18. }
  19. log.Info(fmt.Sprintf("\"%s %s\" %s \"%s\" \"%s\"", r.Method, r.RequestURI, time.Since(start), r.UserAgent(), r.Host))
  20. }()
  21. name := r.URL.Path[1:]
  22. if name == "" {
  23. name = "index"
  24. }
  25. pl := &platform.WriteAs
  26. if r.Host == "developers.snap.as" || r.Host == fmt.Sprintf("devsnap.local:%d", *portPtr) {
  27. pl = &platform.SnapAs
  28. }
  29. p := struct {
  30. Path string
  31. Platform *platform.Platform
  32. }{
  33. Path: name,
  34. Platform: pl,
  35. }
  36. // Make sure the page exists
  37. if _, err := os.Stat(filepath.Join(pagesDir, pl.SiteDir, p.Path+".tmpl")); os.IsNotExist(err) {
  38. log.Info(filepath.Join(pagesDir, pl.SiteDir, p.Path, "index.tmpl"))
  39. if _, err := os.Stat(filepath.Join(pagesDir, pl.SiteDir, p.Path, "index.tmpl")); os.IsNotExist(err) {
  40. t, err := getTemplate(pl.SiteDir, "404")
  41. if err != nil {
  42. http.Error(w, err.Error(), http.StatusInternalServerError)
  43. return
  44. }
  45. w.WriteHeader(http.StatusNotFound)
  46. err = t.ExecuteTemplate(w, "base", p)
  47. if err != nil {
  48. log.Info("Unable to render 404 page: %s", err)
  49. }
  50. return
  51. } else {
  52. p.Path = filepath.Join(p.Path, "index")
  53. log.Info("name is now %s", p.Path)
  54. }
  55. }
  56. // Render the page
  57. t, err := getTemplate(pl.SiteDir, p.Path)
  58. if err != nil {
  59. http.Error(w, err.Error(), http.StatusInternalServerError)
  60. return
  61. }
  62. err = t.ExecuteTemplate(w, "base", p)
  63. if err != nil {
  64. http.Error(w, err.Error(), http.StatusInternalServerError)
  65. return
  66. }
  67. }