// POST /jobs/id/stop or POST /jobs/id/kill func (this RestJsonMongo) Act(rw http.ResponseWriter, parts []string, r *http.Request) (item interface{}) { logger.Debug("Act(%v):%v", r.URL.Path, parts) if len(parts) < 2 { if err := this.LoadJson(r, item); err != nil { http.Error(rw, err.String(), http.StatusBadRequest) return } else { id := parts[1] if err := this.Store.Update(id, item); err != nil { http.Error(rw, err.String(), http.StatusBadRequest) return } } } if this.Target == nil { http.Error(rw, fmt.Sprintf("service not found %v", r.URL.Path), http.StatusNotImplemented) return } preq, _ := http.NewRequest(r.Method, r.URL.Path, r.Body) proxy := http.NewSingleHostReverseProxy(this.Target) go proxy.ServeHTTP(rw, preq) return }
func main() { flag.Parse() readTemplates() if *root == "" { var err os.Error *root, err = os.Getwd() if err != nil { log.Fatalf("Failed to getwd: %v", err) } } fixupGitwebFiles() latestGits := filepath.Join(*root, "latestgits") os.Mkdir(latestGits, 0700) if *gerritHost != "" { go rsyncFromGerrit(latestGits) } mux := http.DefaultServeMux mux.Handle("/favicon.ico", http.FileServer(http.Dir(filepath.Join(*root, "static")))) mux.Handle("/robots.txt", http.FileServer(http.Dir(filepath.Join(*root, "static")))) mux.Handle("/static/", http.StripPrefix("/static/", http.FileServer(http.Dir(filepath.Join(*root, "static"))))) mux.Handle("/talks/", http.StripPrefix("/talks/", http.FileServer(http.Dir(filepath.Join(*root, "talks"))))) gerritUrl, _ := url.Parse("http://gerrit-proxy:8000/") var gerritHandler http.Handler = http.NewSingleHostReverseProxy(gerritUrl) if *httpsAddr != "" { proxyHandler := gerritHandler gerritHandler = http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) { if req.TLS != nil { proxyHandler.ServeHTTP(rw, req) return } http.Redirect(rw, req, "https://camlistore.org"+req.URL.RawPath, http.StatusFound) }) } mux.Handle("/r/", gerritHandler) testCgi := &cgi.Handler{Path: filepath.Join(*root, "test.cgi"), Root: "/test.cgi", } mux.Handle("/test.cgi", testCgi) mux.Handle("/test.cgi/foo", testCgi) mux.Handle("/code", http.RedirectHandler("/code/", http.StatusFound)) if *gitwebScript != "" { env := os.Environ() env = append(env, "GITWEB_CONFIG="+filepath.Join(*root, "gitweb-camli.conf")) env = append(env, "CAMWEB_ROOT="+filepath.Join(*root)) env = append(env, "CAMWEB_GITDIR="+latestGits) mux.Handle("/code/", &fixUpGitwebUrls{&gitwebHandler{ Cgi: &cgi.Handler{ Path: *gitwebScript, Root: "/code/", Env: env, }, Static: http.StripPrefix("/code/", http.FileServer(http.Dir(*gitwebFiles))), }}) } mux.HandleFunc("/", mainHandler) var handler http.Handler = &noWwwHandler{Handler: mux} if *logDir != "" || *logStdout { handler = NewLoggingHandler(handler, *logDir, *logStdout) } errch := make(chan os.Error) httpServer := &http.Server{ Addr: *httpAddr, Handler: handler, ReadTimeout: connTimeoutNanos, WriteTimeout: connTimeoutNanos, } go func() { errch <- httpServer.ListenAndServe() }() if *httpsAddr != "" { log.Printf("Starting TLS server on %s", *httpsAddr) httpsServer := new(http.Server) *httpsServer = *httpServer httpsServer.Addr = *httpsAddr go func() { errch <- httpsServer.ListenAndServeTLS(*tlsCertFile, *tlsKeyFile) }() } log.Fatalf("Serve error: %v", <-errch) }