Heim  >  Artikel  >  Backend-Entwicklung  >  Überschreiben des HTTP-Host-Headers des gRPC-Clients in Golang

Überschreiben des HTTP-Host-Headers des gRPC-Clients in Golang

王林
王林nach vorne
2024-02-09 08:18:181295Durchsuche

Überschreiben des HTTP-Host-Headers des gRPC-Clients in Golang

Es ist eine häufige Anforderung, den http-Host-Header des gRPC-Clients in Golang zu überschreiben. gRPC ist ein leistungsstarkes, sprachübergreifendes Remote-Prozeduraufruf-Framework. Bei der Verwendung von gRPC für die Kommunikation ist es manchmal erforderlich, den Host-Header der http-Anfrage anzupassen. Der PHP-Editor Xigua stellt Ihnen vor, wie Sie diese Funktion in Golang implementieren, um Ihre Geschäftsanforderungen besser zu erfüllen.

Frageninhalt

Ich habe die Anfrage über die Verbindung per gRPC-Client gesendet

conn, err := grpc.Dial("hostname:port",opts...)

Von der Serverseite sehe ich host是确切的hostname:port in http.request. Dann ist mein Nginx-Server wie folgt eingerichtet

server {
    listen port http2;
    server_name hostname;
    # ...
}
server {
    listen port http2;
    server_name another_hostname;
    # ...
}

Dies ist eine gängige Webhosting-Technologie. Egal welchen Hostnamen ich verwende grpc.Dial(xxx:port) es funktioniert einwandfrei. Wenn ich jedoch

sage
md := metadata.New(map[string]string{"host":"another_hostname:port"})

Im grpc-Kontext (wird im Header der http2-Anfrage ausgefüllt). Diese Anfrage wird von Nginx blockiert und ich erhalte

rpc error: code = Internal desc = unexpected HTTP status code received from server: 400 (Bad Request); transport: received unexpected content-type "text/html"

Der Grund, warum Sie den Hostnamen manuell eingeben müssen, liegt darin, dass auf grpc.Dial中的主机名是固定的。而且我不能使用不同的位置来做反向代理,因为port der Routingpfad der Restful API folgt.

Wenn der Hostname festgelegt ist und die Route ebenfalls festgelegt ist, gibt es dann eine andere Möglichkeit, den Proxy umzukehren?

(23.09.) Update: Es stellt sich heraus, dass der Host-Header in http2 durch den Pseudo-Header :Authority ersetzt wurde. :Authority伪头取代了。

解决方法

gRPC 使用 HTTP/2,不使用 :host 标头,而是使用 :authorityWorkaround

gRPC verwendet HTTP/2 und verwendet nicht den Header :host, sondern den Pseudoheader :authority. Der Wert dieses Headers wird hier ermittelt:

https://github.com/grpc/grpc-go/blob/aa6ce35c792863305e0f42acc27f2c7153275f89/clientconn.go#L1942

:authority 标头的值是用户拨号目标的端点部分,其格式为 url://authority/endpointTL;PhD

Standardmäßig verwendet für authority。请参阅:https://pkg.go.dev/google.golang.org/ grpc#WithAuthority。但还要注意,此拨号选项会覆盖 TLS 握手期间使用的 ServerName.

gRPC-Go unterstützt auch Einwahloptionen, um diese Autorität zu überschreiben. Siehe: https://pkg.go.dev/google.golang.org/ grpc#WithAuthority

. Beachten Sie jedoch auch, dass diese Wähloption den während des TLS-Handshakes verwendeten ServerName-Wert überschreibt. 🎜 🎜Wenn Sie weitere Fragen/Bedenken haben, können Sie uns gerne über unser GitHub-Repository kontaktieren. Ihre Anfragen werden dort schneller beantwortet. 🎜

Das obige ist der detaillierte Inhalt vonÜberschreiben des HTTP-Host-Headers des gRPC-Clients in Golang. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen