go gin フレームワークでヘッダーを設定するときに注意する必要がある落とし穴

まず問題について話しますが、go ginフレームワークでc.Header("new-token", "123")set key 値を使用するとhttp header、set new-tokenkey はNew-Token!

ここに画像の説明を挿入します

事件始末

最近、私はサーバー認証という比較的単純なロジックに取り組んでいます。

クライアントのリクエストを受信した後、サーバーはクライアントによってもたらされた検証パラメータの有効期限が切れているtokenかどうかを検証します。token有効期限が 1 日未満の場合は、新しいパラメータを生成し、 をtoken設定http headerしてローカル キャッシュを更新するnew-tokenようにクライアントに通知します。token

ここに画像の説明を挿入します

関数の準備が完了しました。サンプルコードは次のとおりです。

サーバーはtoken時刻を検証するロジックを省略し、token設定のロジックのみを提供します。

package main

import (
	"github.com/gin-gonic/gin"
)

func main() {
    
    
	engine := gin.Default()
	
	engine.GET("/header", func(c *gin.Context) {
    
    
		c.Header("new-token", "123")
		c.String(200, "ok")
	})
	
	engine.Run(":4780")
}

この時、クライアント接続担当者に「クライアントキャッシュの有効期限が近づいたら、tokenを設定することで更新されたことを知らせます。クライアントキャッシュを置き換えるだけで大​​丈夫です」と伝えました。http headernew-tokentoken

フロントエンドの人のコードは次のとおりです。

if (response.headers && response.headers['new-token']) {
    
    
	store.upadteToken(response.headers['new-token'])
}

関数は複雑ではないので、私はテストせずに (フロントエンド担当者もテストしませんでした)、テストのために直接送信しました。また、token有効期限も比較的長めに設定されており、ここ数日はそれほど更新する必要はありませんでしたtoken

しかしある日突然、テスト担当者が「問題があるので確認する必要がある」と言いました。私はコードを見て、それは私の問題ではないと直接否定しました。フロントエンド担当者もそれを直接否定しました。

他に方法はなかったので、2 人は犯罪現場に行って比較したところ、問題はバックエンドがnew-tokenすべての小文字を返さないことであることがわかりましたNew-Token

ここに画像の説明を挿入します

位置決めの問題

恥を知れ!

少し面目を取り戻すためにソースコードを確認したところ、ginフレームワークがheader設定することが分かりました。

go最終的には、次のようなソース コードgo\src\net\textprotoメソッドに到達しますCanonicalMIMEHeaderKey(s string) string

// CanonicalMIMEHeaderKey returns the canonical format of the
// MIME header key s. The canonicalization converts the first
// letter and any letter following a hyphen to upper case;
// the rest are converted to lowercase. For example, the
// canonical key for "accept-encoding" is "Accept-Encoding".
// MIME header keys are assumed to be ASCII only.
// If s contains a space or invalid header field bytes, it is
// returned without modifications.
func CanonicalMIMEHeaderKey(s string) string {
    
    
	commonHeaderOnce.Do(initCommonHeader)

	// Quick check for canonical encoding.
	upper := true
	for i := 0; i < len(s); i++ {
    
    
		c := s[i]
		if !validHeaderFieldByte(c) {
    
    
			return s
		}
		if upper && 'a' <= c && c <= 'z' {
    
    
			return canonicalMIMEHeaderKey([]byte(s))
		}
		if !upper && 'A' <= c && c <= 'Z' {
    
    
			return canonicalMIMEHeaderKey([]byte(s))
		}
		upper = c == '-'
	}
	return s
}

ご覧のとおり、ここで割り当てたheaderキーがnew-token大文字に変更されますNew-Token

終わりのアドバイス

あなたは、自分がとても良い人であることを同僚に知られたくないでしょう? xxxx

フレームワークを使用すると確かに時間を大幅に節約できますが、フレームワークを使用する場合は、機能がどんなに小さい場合でもテストする必要があります。そうしないと、この記事で説明したのと同様の問題が発生する可能性があります。

おすすめ

転載: blog.csdn.net/DisMisPres/article/details/129735349