Ayman
Ayman

Reputation: 1009

How can I read a header from an http request in golang?

If I receive a request of type http.Request, how can I read the value of a specific header? In this case I want to pull the value of a jwt token out of the request header.

Upvotes: 73

Views: 131018

Answers (3)

Sarvnashak
Sarvnashak

Reputation: 829

Note: The accepted answer is missing some information.

A Header represents the key-value pairs in an HTTP header. It's defined as a map where key is of string type and value is an array of string type.

type Header map[string][]string

Actually, r.Header.Get gets the first value associated with the given key i.e. it just gets the first string from index 0.

This is okay if your header just have one value but if it has multiple values, you may miss out on some information.

Eg. User-Agent header has multiple values against the same key.

user-agent: ["Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6)",  "AppleWebKit/537.36 (KHTML, like Gecko)", "Chrome/80.0.3987.106 Safari/537.36",]

So if you use r.Header.get("User-Agent") , it'll return Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) only and not the rest of the values.

If you want to get all the values you can use this:

req.Header["User-Agent"]

Upvotes: 13

nbari
nbari

Reputation: 26895

You can use the r.Header.Get:

func yourHandler(w http.ResponseWriter, r *http.Request) {
    ua := r.Header.Get("User-Agent")
    ...
}

Upvotes: 116

Ravi R
Ravi R

Reputation: 1782

package main

import (
    "fmt"
    "log"
    "net/http"
)

func main() {
    http.HandleFunc("/", handler)
    log.Fatal(http.ListenAndServe("localhost:8000", nil))
}

func handler(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "%s %s %s \n", r.Method, r.URL, r.Proto)
    //Iterate over all header fields
    for k, v := range r.Header {
        fmt.Fprintf(w, "Header field %q, Value %q\n", k, v)
    }

    fmt.Fprintf(w, "Host = %q\n", r.Host)
    fmt.Fprintf(w, "RemoteAddr= %q\n", r.RemoteAddr)
    //Get value for a specified token
    fmt.Fprintf(w, "\n\nFinding value of \"Accept\" %q", r.Header["Accept"])
}

Connecting to http://localhost:8000/ from a browser will print the output in the browser.

Upvotes: 22

Related Questions