| // Copyright 2017 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 app implements the performance data analysis server. |
| package app |
| |
| import ( |
| "net/http" |
| |
| "golang.org/x/perf/storage" |
| ) |
| |
| // App manages the analysis server logic. |
| // Construct an App instance and call RegisterOnMux to connect it with an HTTP server. |
| type App struct { |
| // StorageClient is used to talk to the storage server. |
| StorageClient *storage.Client |
| |
| // BaseDir is the directory containing the "template" directory. |
| // If empty, the current directory will be used. |
| BaseDir string |
| } |
| |
| // RegisterOnMux registers the app's URLs on mux. |
| func (a *App) RegisterOnMux(mux *http.ServeMux) { |
| mux.HandleFunc("/", a.index) |
| mux.HandleFunc("/search", a.search) |
| mux.HandleFunc("/compare", a.compare) |
| mux.HandleFunc("/trend", a.trend) |
| } |
| |
| // search handles /search. |
| // This currently just runs the compare handler, until more analysis methods are implemented. |
| func (a *App) search(w http.ResponseWriter, r *http.Request) { |
| if err := r.ParseForm(); err != nil { |
| http.Error(w, err.Error(), 500) |
| return |
| } |
| if r.Header.Get("Accept") == "text/plain" || r.Header.Get("X-Benchsave") == "1" { |
| // TODO(quentin): Switch to real Accept negotiation when golang/go#19307 is resolved. |
| // Benchsave sends both of these headers. |
| a.textCompare(w, r) |
| return |
| } |
| // TODO(quentin): Intelligently choose an analysis method |
| // based on the results from the query, once there is more |
| // than one analysis method. |
| //q := r.Form.Get("q") |
| a.compare(w, r) |
| } |