How can you log HTTP responses in Go\'s `http.HandleFunc` using middleware chaining and functional handler combinators?

Patricia Arquette
Release: 2024-10-28 04:41:30
Original
782 people have browsed it

How can you log HTTP responses in Go's `http.HandleFunc` using middleware chaining and functional handler combinators?

Logging Responses to Incoming HTTP Requests in http.HandleFunc

In the previous article titled "In go, how to inspect the HTTP response that is written to http.ResponseWriter?" we explored a method for inspecting server responses in a unit testing environment. However, this approach may not be suitable for live servers.

Middleware Chaining

An alternative solution is middleware chaining, a commonly used technique for modifying and logging HTTP responses and requests while preserving the original request-response flow.

Functional Handler Combinators

Instead of using a library like negroni, we can create our own functional handler combinators:

<code class="go">func NewFooHandler(next http.HandlerFunc) http.HandlerFunc {
    return func(w http.ResponseWriter, r *http.Request) {
        // do something before
        next(w, r)
        // do something after
    }
}</code>
Copy after login

Creating a Chain of Handlers

We can chain multiple handlers together using the combinators:

<code class="go">h := NewFooHandler(NewBarHandler(NewBazHandler(Sink)))</code>
Copy after login

In this example, Sink is an empty handler that does nothing.

Implementing Response Logging

Using the handler combinator approach, we can create a handler that logs the response:

<code class="go">func NewResponseLoggingHandler(next http.HandlerFunc) http.HandlerFunc {
    return func(w http.ResponseWriter, r *http.Request) {
        // Replace the response writer with a recorder
        c := httptest.NewRecorder()
        next(c, r)

        // Copy the response from the recorder to the actual writer
        for k, v := range c.HeaderMap {
            w.Header()[k] = v
        }
        w.WriteHeader(c.Code)
        c.Body.WriteTo(w)
    }
}</code>
Copy after login

Applying the Response Logging Handler

We can apply the response logging handler to all HTTP routes by creating a default handler combinator:

<code class="go">func NewDefaultHandler(next http.HandlerFunc) http.HandlerFunc {
    return NewResponseLoggingHandler(NewOtherStuffHandler(next))
}</code>
Copy after login

This way, whenever we start a chain like:

<code class="go">h := NewDefaultHandler(...)</code>
Copy after login

It will automatically include response logging and any other default handlers.

The above is the detailed content of How can you log HTTP responses in Go\'s `http.HandleFunc` using middleware chaining and functional handler combinators?. For more information, please follow other related articles on the PHP Chinese website!

source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Latest Articles by Author
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
About us Disclaimer Sitemap
php.cn:Public welfare online PHP training,Help PHP learners grow quickly!