| OLD | NEW |
| 1 // docserver is a super simple Markdown (CommonMark) server. | 1 // docserver is a super simple Markdown (CommonMark) server. |
| 2 // | 2 // |
| 3 // Every directory has an index.md and the first line of index.md is used as | 3 // Every directory has an index.md and the first line of index.md is used as |
| 4 // the display name for that directory. The directory name itself is used in | 4 // the display name for that directory. The directory name itself is used in |
| 5 // the URL path. See README.md for more design details. | 5 // the URL path. See README.md for more design details. |
| 6 package main | 6 package main |
| 7 | 7 |
| 8 import ( | 8 import ( |
| 9 "flag" | 9 "flag" |
| 10 "fmt" | |
| 11 "mime" | 10 "mime" |
| 12 "net/http" | 11 "net/http" |
| 13 "path/filepath" | 12 "path/filepath" |
| 14 "runtime" | 13 "runtime" |
| 15 "text/template" | 14 "text/template" |
| 16 "time" | 15 "time" |
| 17 | 16 |
| 18 "strconv" | 17 "strconv" |
| 19 "strings" | 18 "strings" |
| 20 | 19 |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 106 // When running in local mode reload all templates and rebuild the navig
ation | 105 // When running in local mode reload all templates and rebuild the navig
ation |
| 107 // menu on every request, so we don't have to start and stop the server
while | 106 // menu on every request, so we don't have to start and stop the server
while |
| 108 // developing. | 107 // developing. |
| 109 if *local { | 108 if *local { |
| 110 d.BuildNavigation() | 109 d.BuildNavigation() |
| 111 loadTemplates() | 110 loadTemplates() |
| 112 } | 111 } |
| 113 | 112 |
| 114 filename, raw, err := d.RawFilename(r.URL.Path) | 113 filename, raw, err := d.RawFilename(r.URL.Path) |
| 115 if err != nil { | 114 if err != nil { |
| 116 » » util.ReportError(w, r, err, fmt.Sprintf("Failed to find a matchi
ng file for %q %q", r.URL.Path, filename)) | 115 » » glog.Infof("Request for unknown path: %s", r.URL.Path) |
| 116 » » http.NotFound(w, r) |
| 117 return | 117 return |
| 118 } | 118 } |
| 119 | 119 |
| 120 // Set the content type. | 120 // Set the content type. |
| 121 mimetype := "text/html" | 121 mimetype := "text/html" |
| 122 if raw { | 122 if raw { |
| 123 mimetype = mime.TypeByExtension(filepath.Ext(filename)) | 123 mimetype = mime.TypeByExtension(filepath.Ext(filename)) |
| 124 } | 124 } |
| 125 w.Header().Set("Content-Type", mimetype) | 125 w.Header().Set("Content-Type", mimetype) |
| 126 | 126 |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 160 common.InitWithMetrics("docserver", graphiteServer) | 160 common.InitWithMetrics("docserver", graphiteServer) |
| 161 Init() | 161 Init() |
| 162 | 162 |
| 163 // Resources are served directly. | 163 // Resources are served directly. |
| 164 http.HandleFunc("/res/", autogzip.HandleFunc(makeResourceHandler())) | 164 http.HandleFunc("/res/", autogzip.HandleFunc(makeResourceHandler())) |
| 165 http.HandleFunc("/", autogzip.HandleFunc(mainHandler)) | 165 http.HandleFunc("/", autogzip.HandleFunc(mainHandler)) |
| 166 | 166 |
| 167 glog.Infoln("Ready to serve.") | 167 glog.Infoln("Ready to serve.") |
| 168 glog.Fatal(http.ListenAndServe(*port, nil)) | 168 glog.Fatal(http.ListenAndServe(*port, nil)) |
| 169 } | 169 } |
| OLD | NEW |