Show the IP information API on the home page (closes #156)
check / check (push) Canceled after 0s
check / check (push) Canceled after 0s
The home page gets an IP information API card. It shows the curl
command that looks up the visitor's own address at /ip/{addr}. The page
then makes that same request and shows the JSON answer, pretty-printed.
An error answer, such as a 404 for an address with no route, is shown
the same way. A request that fails shows an error line.
The server gives the page the visitor's address, found as /ip/ finds
it, so a trusted proxy's X-Forwarded-For is honoured. The command takes
its origin from the browser, so it names the host the visitor used.
Model: opus-5-5
This commit was merged in pull request #183.
This commit is contained in:
@@ -146,7 +146,10 @@ func (s *Server) handleIndex() http.HandlerFunc {
|
||||
|
||||
tmpl := templates.IndexTemplate()
|
||||
|
||||
err := tmpl.Execute(w, pageData{CSPNonce: cspNonce(r.Context())})
|
||||
err := tmpl.Execute(w, indexPageData{
|
||||
CSPNonce: cspNonce(r.Context()),
|
||||
ClientIP: extractClientIP(r),
|
||||
})
|
||||
if err != nil {
|
||||
s.logger.Error("Failed to render index template", "error", err)
|
||||
http.Error(w, "Internal Server Error", http.StatusInternalServerError)
|
||||
@@ -160,6 +163,15 @@ type pageData struct {
|
||||
CSPNonce string
|
||||
}
|
||||
|
||||
// indexPageData is what the home page is rendered with.
|
||||
type indexPageData struct {
|
||||
// CSPNonce is the nonce the page's script and style blocks carry.
|
||||
CSPNonce string
|
||||
// ClientIP is the visitor's address, which the IP information API card
|
||||
// looks up: the address /ip/ would look up for the same request.
|
||||
ClientIP string
|
||||
}
|
||||
|
||||
// writeJSONError writes a standardized JSON error response with the given
|
||||
// status code and error message.
|
||||
func (s *Server) writeJSONError(w http.ResponseWriter, statusCode int, message string) {
|
||||
|
||||
Reference in New Issue
Block a user