Как проверить неявно установить заголовки http с сервера golang? - PullRequest
0 голосов
/ 18 июня 2019

Я создал простой сервер http2, Если я отправляю запрос на него с помощью curl, он отвечает некоторыми заголовками, хотя я не установил их в явном виде. Как я могу получить к ним доступ внутри функции обработки запросов (скажем, hello)? Мой код (я никогда раньше не использовал golang)

server.go

package main

import (
  "net/http"
  "strings"
  "fmt"
  "github.com/gorilla/mux"
  "golang.org/x/net/http2"
)

func sayHello(w http.ResponseWriter, r *http.Request) {
  message := r.URL.Path
  message = strings.TrimPrefix(message, "/")
  message = "Hello " + message

  w.Header().Set("myFirst", "golangQuestion")
  w.Write([]byte(message))
  for k, v := range w.Header() {
    fmt.Println("[RESPONSE][Header]", k,":", v)
    }
}

func main() {
    router := mux.NewRouter()
    router.PathPrefix("/").HandlerFunc(sayHello) // catch everything else rule
    var srv = &http.Server{
        Addr: "127.0.0.1:8081",
    }
    http2.ConfigureServer(srv, nil)
    srv.Handler = router
    sslCert := "./ssl.cert"
    sslKey := "./ssl.key"
    if err := srv.ListenAndServeTLS(sslCert, sslKey); err != nil {
        panic(err)
    }
}

Отправка запроса:

завиток - головка - незащищенная https://127.0.0.1:8081

HTTP/1.1 200 OK
Myfirst: golangQuestion
Date: Tue, 18 Jun 2019 09:18:29 GMT
Content-Length: 6
Content-Type: text/plain; charset=utf-8

Я вижу, что некоторые заголовки отправляются обратно, тот, который я установил явно, также получен, но вывод

иди запусти server.go

[RESPONSE][Header] Myfirst : [golangQuestion]

Как я могу получить доступ к другим заголовкам, которые не были явно установлены, но также получены curl? Я перебрал w.Headers , но он не содержал неявно установленных заголовков

  for k, v := range w.Header() {
    fmt.Println("[RESPONSE][Header]", k,":", v)
    }

Я ожидаю, что выходные данные go run server.go должны выглядеть примерно так:

[RESPONSE][Header] Myfirst : [golangQuestion]
[RESPONSE][Header] Date: [2019.02.12 ]
[RESPONSE][Header] Content-Length: [6]

1 Ответ

1 голос
/ 18 июня 2019

Эти заголовки отправляются автоматически, когда вы звоните ResponseWriter.Write().Цитирование из его документа:

// Write writes the data to the connection as part of an HTTP reply.
//
// If WriteHeader has not yet been called, Write calls
// WriteHeader(http.StatusOK) before writing the data. If the Header
// does not contain a Content-Type line, Write adds a Content-Type set
// to the result of passing the initial 512 bytes of written data to
// DetectContentType. Additionally, if the total size of all written
// data is under a few KB and there are no Flush calls, the
// Content-Length header is added automatically.
//
// Depending on the HTTP protocol version and the client, calling
// Write or WriteHeader may prevent future reads on the
// Request.Body. For HTTP/1.x requests, handlers should read any
// needed request body data before writing the response. Once the
// headers have been flushed (due to either an explicit Flusher.Flush
// call or writing enough data to trigger a flush), the request body
// may be unavailable. For HTTP/2 requests, the Go HTTP server permits
// handlers to continue to read the request body while concurrently
// writing the response. However, such behavior may not be supported
// by all HTTP/2 clients. Handlers should read before writing if
// possible to maximize compatibility.
Write([]byte) (int, error)

ResponseWriter.Header() содержит только заголовки, установленные явно.Content-Type и Content-Length были отправлены w.Write().

Примечание: если вы хотите отключить такие автоматические заголовки, вы должны установить их значения на nil, например:

w.Header()["Date"] = nil

Также обратите внимание, что если вы установите значения таких заголовков вручную, эти значения будут отправлены без изменений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...