// 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. // +build appengine package main // This file replaces main.go when running godoc under app-engine. // See README.godoc-app for details. import ( "archive/zip" "log" "net/http" "path" ) func serveError(w http.ResponseWriter, r *http.Request, relpath string, err error) { w.WriteHeader(http.StatusNotFound) servePage(w, Page{ Title: "File " + relpath, Subtitle: relpath, Body: applyTemplate(errorHTML, "errorHTML", err), // err may contain an absolute path! }) } 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) *showPlayground = true // 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.Bind("/", NewZipFS(rc, zipFilename), *goroot, bindReplace) // initialize http handlers readTemplates() initHandlers() registerPublicHandlers(http.DefaultServeMux) // initialize default directory tree with corresponding timestamp. initFSTree() // Immediately update metadata. updateMetadata() // initialize search index if *indexEnabled { go indexer() } log.Println("godoc initialization complete") }