| // Copyright 2011 The Go Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style | |
| // license that can be found in the LICENSE file. | |
| package main | |
| // This file replaces main.go when running godoc under app-engine. | |
| // See README.godoc-app for details. | |
| import ( | |
| "archive/zip" | |
| "http" | |
| "log" | |
| "path" | |
| ) | |
| func serveError(w http.ResponseWriter, r *http.Request, relpath string, err error) { | |
| contents := applyTemplate(errorHTML, "errorHTML", err) // err may contain an absolute path! | |
| w.WriteHeader(http.StatusNotFound) | |
| servePage(w, "File "+relpath, "", "", contents) | |
| } | |
| func init() { | |
| log.Println("initializing godoc ...") | |
| log.Printf(".zip file = %s", zipFilename) | |
| log.Printf(".zip GOROOT = %s", zipGoroot) | |
| log.Printf("index files = %s", indexFilenames) | |
| // initialize flags for app engine | |
| *goroot = path.Join("/", zipGoroot) // fsHttp paths are relative to '/' | |
| *indexEnabled = true | |
| *indexFiles = indexFilenames | |
| *maxResults = 100 // reduce latency by limiting the number of fulltext search results | |
| *indexThrottle = 0.3 // in case *indexFiles is empty (and thus the indexer is run) | |
| // read .zip file and set up file systems | |
| const zipfile = zipFilename | |
| rc, err := zip.OpenReader(zipfile) | |
| if err != nil { | |
| log.Fatalf("%s: %s\n", zipfile, err) | |
| } | |
| // rc is never closed (app running forever) | |
| fs = NewZipFS(rc) | |
| fsHttp = NewHttpZipFS(rc, *goroot) | |
| // initialize http handlers | |
| readTemplates() | |
| initHandlers() | |
| registerPublicHandlers(http.DefaultServeMux) | |
| // initialize default directory tree with corresponding timestamp. | |
| initFSTree() | |
| // initialize directory trees for user-defined file systems (-path flag). | |
| initDirTrees() | |
| // initialize search index | |
| if *indexEnabled { | |
| go indexer() | |
| } | |
| log.Println("godoc initialization complete") | |
| } |