|
@@ -69,7 +69,6 @@ func (ec *errorCatcher) PrintErr(args ...interface{}) {
|
69
|
69
|
|
70
|
70
|
// webArgs contains arguments passed to templates in webhtml.go.
|
71
|
71
|
type webArgs struct {
|
72
|
|
- BaseURL string
|
73
|
72
|
Title string
|
74
|
73
|
Errors []string
|
75
|
74
|
Total int64
|
|
@@ -172,7 +171,15 @@ func defaultWebServer(args *plugin.HTTPServerArgs) error {
|
172
|
171
|
}
|
173
|
172
|
h.ServeHTTP(w, req)
|
174
|
173
|
})
|
175
|
|
- s := &http.Server{Handler: handler}
|
|
174
|
+
|
|
175
|
+ // We serve the ui at /ui/ and redirect there from the root. This is done
|
|
176
|
+ // to surface any problems with serving the ui at a non-root early. See:
|
|
177
|
+ //
|
|
178
|
+ // https://github.com/google/pprof/pull/348
|
|
179
|
+ mux := http.NewServeMux()
|
|
180
|
+ mux.Handle("/ui/", http.StripPrefix("/ui", handler))
|
|
181
|
+ mux.Handle("/", http.RedirectHandler("/ui/", http.StatusTemporaryRedirect))
|
|
182
|
+ s := &http.Server{Handler: mux}
|
176
|
183
|
return s.Serve(ln)
|
177
|
184
|
}
|
178
|
185
|
|
|
@@ -248,11 +255,10 @@ func (ui *webInterface) makeReport(w http.ResponseWriter, req *http.Request,
|
248
|
255
|
}
|
249
|
256
|
|
250
|
257
|
// render generates html using the named template based on the contents of data.
|
251
|
|
-func (ui *webInterface) render(w http.ResponseWriter, baseURL, tmpl string,
|
|
258
|
+func (ui *webInterface) render(w http.ResponseWriter, tmpl string,
|
252
|
259
|
rpt *report.Report, errList, legend []string, data webArgs) {
|
253
|
260
|
file := getFromLegend(legend, "File: ", "unknown")
|
254
|
261
|
profile := getFromLegend(legend, "Type: ", "unknown")
|
255
|
|
- data.BaseURL = baseURL
|
256
|
262
|
data.Title = file + " " + profile
|
257
|
263
|
data.Errors = errList
|
258
|
264
|
data.Total = rpt.Total()
|
|
@@ -297,7 +303,7 @@ func (ui *webInterface) dot(w http.ResponseWriter, req *http.Request) {
|
297
|
303
|
nodes = append(nodes, n.Info.Name)
|
298
|
304
|
}
|
299
|
305
|
|
300
|
|
- ui.render(w, "/", "graph", rpt, errList, legend, webArgs{
|
|
306
|
+ ui.render(w, "graph", rpt, errList, legend, webArgs{
|
301
|
307
|
HTMLBody: template.HTML(string(svg)),
|
302
|
308
|
Nodes: nodes,
|
303
|
309
|
})
|
|
@@ -332,7 +338,7 @@ func (ui *webInterface) top(w http.ResponseWriter, req *http.Request) {
|
332
|
338
|
nodes = append(nodes, item.Name)
|
333
|
339
|
}
|
334
|
340
|
|
335
|
|
- ui.render(w, "/top", "top", rpt, errList, legend, webArgs{
|
|
341
|
+ ui.render(w, "top", rpt, errList, legend, webArgs{
|
336
|
342
|
Top: top,
|
337
|
343
|
Nodes: nodes,
|
338
|
344
|
})
|
|
@@ -354,7 +360,7 @@ func (ui *webInterface) disasm(w http.ResponseWriter, req *http.Request) {
|
354
|
360
|
}
|
355
|
361
|
|
356
|
362
|
legend := report.ProfileLabels(rpt)
|
357
|
|
- ui.render(w, "/disasm", "plaintext", rpt, errList, legend, webArgs{
|
|
363
|
+ ui.render(w, "plaintext", rpt, errList, legend, webArgs{
|
358
|
364
|
TextBody: out.String(),
|
359
|
365
|
})
|
360
|
366
|
|
|
@@ -378,7 +384,7 @@ func (ui *webInterface) source(w http.ResponseWriter, req *http.Request) {
|
378
|
384
|
}
|
379
|
385
|
|
380
|
386
|
legend := report.ProfileLabels(rpt)
|
381
|
|
- ui.render(w, "/source", "sourcelisting", rpt, errList, legend, webArgs{
|
|
387
|
+ ui.render(w, "sourcelisting", rpt, errList, legend, webArgs{
|
382
|
388
|
HTMLBody: template.HTML(body.String()),
|
383
|
389
|
})
|
384
|
390
|
}
|
|
@@ -399,7 +405,7 @@ func (ui *webInterface) peek(w http.ResponseWriter, req *http.Request) {
|
399
|
405
|
}
|
400
|
406
|
|
401
|
407
|
legend := report.ProfileLabels(rpt)
|
402
|
|
- ui.render(w, "/peek", "plaintext", rpt, errList, legend, webArgs{
|
|
408
|
+ ui.render(w, "plaintext", rpt, errList, legend, webArgs{
|
403
|
409
|
TextBody: out.String(),
|
404
|
410
|
})
|
405
|
411
|
}
|