Transport
Transport adalah lapisan HTTP tipis yang dipakai fungsi pemanggil di
setiap package domain untuk mengirim request hasil bangunan
HeaderBuilder dan mendekode responsnya.
Transport
type Transport struct {
HTTPClient *http.Client
}func (t *Transport) Do(ctx context.Context, hb HeaderBuilder) (Envelope, error)Do menandatangani hb (lewat hb.Build()), mengirimnya, dan mendekode
body respons menjadi Envelope. Fungsi ini tidak melakukan retry,
rate-limit, atau menafsirkan responseCode non-2xx sebagai error Go —
hanya kegagalan tingkat transport (error saat membangun header, error
jaringan, body bukan JSON, context dibatalkan) yang dikembalikan sebagai
error. Menafsirkan respons yang sudah didekode sebagai
sukses/gagal adalah tugas pemanggil, lewat snap.CheckResponseStatus
(lihat Errors).
Bila HTTPClient dibiarkan nil, Transport membangun satu dengan
timeout default yang tidak pernah mengikuti redirect. Ini penting:
klien HTTP default Go meneruskan sebagian besar header (termasuk
X-SIGNATURE, X-CLIENT-KEY, X-PARTNER-ID yang sudah Anda
tandatangani) — dan untuk 307/308, seluruh body — ke host manapun yang
dituju redirect. Tidak ada endpoint SNAP yang punya alasan sah untuk
melakukan redirect, jadi Do memperlakukan redirect seperti request gagal
lainnya, bukan mengikutinya.
Body respons dibatasi ukurannya saat dibaca, supaya server yang bermasalah atau jahat tidak bisa memaksa pemakaian memori tak terbatas.
Envelope
type Envelope struct {
StatusCode int
ResponseCode string
ResponseMessage string
Raw json.RawMessage
}Envelope adalah bentuk respons generik yang sudah didekode: StatusCode
HTTP tingkat transport ditambah field envelope SNAP apa pun yang dibawa
body. Fungsi pemanggil di setiap package domain melakukan unmarshal Raw
ke tipe respons masing-masing.
StatusCode penting karena ResponseCode hanya bisa diandalkan ketika
server benar-benar mengembalikan bentuk error SNAP sendiri — body dari
proxy, WAF, atau gateway di depannya mungkin tidak membawa ResponseCode
sama sekali. Binding yang tidak punya ResponseCode untuk dijadikan
fallback sebaiknya mengacu ke StatusCode, pola yang sama yang dipakai
TokenManager secara internal.