まず問題について話しますが、go gin
フレームワークでc.Header("new-token", "123")
set key 値を使用するとhttp header
、set new-token
key は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 header
new-token
token
フロントエンドの人のコードは次のとおりです。
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
フレームワークを使用すると確かに時間を大幅に節約できますが、フレームワークを使用する場合は、機能がどんなに小さい場合でもテストする必要があります。そうしないと、この記事で説明したのと同様の問題が発生する可能性があります。