Winerror.hなどを見ていると、HTTPステータスコードを表現するHRESULT値があることに気付きます。

最初にネタばらししてしまうと、すべてMAKE_HRESULT(SEVERITY_ERROR, FACILITY_HTTP, ステータスコード)で組み立てられるのです。それでは、一覧してみましょう。

定数名
BG_E_HTTP_ERROR_1000x80190064
BG_E_HTTP_ERROR_1010x80190065
BG_E_HTTP_ERROR_2000x801900C8
BG_E_HTTP_ERROR_2010x801900C9
BG_E_HTTP_ERROR_2020x801900CA
BG_E_HTTP_ERROR_2030x801900CB
BG_E_HTTP_ERROR_2040x801900CC
BG_E_HTTP_ERROR_2050x801900CD
BG_E_HTTP_ERROR_2060x801900CE
BG_E_HTTP_ERROR_3000x8019012C
HTTP_E_STATUS_AMBIGUOUS
BG_E_HTTP_ERROR_3010x8019012D
HTTP_E_STATUS_MOVED
BG_E_HTTP_ERROR_3020x8019012E
HTTP_E_STATUS_REDIRECT
BG_E_HTTP_ERROR_3030x8019012F
HTTP_E_STATUS_REDIRECT_METHOD
BG_E_HTTP_ERROR_3040x80190130
HTTP_E_STATUS_NOT_MODIFIED
BG_E_HTTP_ERROR_3050x80190131
HTTP_E_STATUS_USE_PROXY
BG_E_HTTP_ERROR_3070x80190133
HTTP_E_STATUS_REDIRECT_KEEP_VERB
BG_E_HTTP_ERROR_4000x80190190
HTTP_E_STATUS_BAD_REQUEST
BG_E_HTTP_ERROR_4010x80190191
HTTP_E_STATUS_DENIED
BG_E_HTTP_ERROR_4020x80190192
HTTP_E_STATUS_PAYMENT_REQ
BG_E_HTTP_ERROR_4030x80190193
HTTP_E_STATUS_FORBIDDEN
BG_E_HTTP_ERROR_4040x80190194
HTTP_E_STATUS_NOT_FOUND
BG_E_HTTP_ERROR_4050x80190195
HTTP_E_STATUS_BAD_METHOD
BG_E_HTTP_ERROR_4060x80190196
HTTP_E_STATUS_NONE_ACCEPTABLE
BG_E_HTTP_ERROR_4070x80190197
HTTP_E_STATUS_PROXY_AUTH_REQ
BG_E_HTTP_ERROR_4080x80190198
HTTP_E_STATUS_REQUEST_TIMEOUT
BG_E_HTTP_ERROR_4090x80190199
HTTP_E_STATUS_CONFLICT
BG_E_HTTP_ERROR_4100x8019019A
HTTP_E_STATUS_GONE
BG_E_HTTP_ERROR_4110x8019019B
HTTP_E_STATUS_LENGTH_REQUIRED
BG_E_HTTP_ERROR_4120x8019019C
HTTP_E_STATUS_PRECOND_FAILED
BG_E_HTTP_ERROR_4130x8019019D
HTTP_E_STATUS_REQUEST_TOO_LARGE
BG_E_HTTP_ERROR_4140x8019019E
HTTP_E_STATUS_URI_TOO_LONG
BG_E_HTTP_ERROR_4150x8019019F
HTTP_E_STATUS_UNSUPPORTED_MEDIA
BG_E_HTTP_ERROR_4160x801901A0
HTTP_E_STATUS_RANGE_NOT_SATISFIABLE
BG_E_HTTP_ERROR_4170x801901A1
HTTP_E_STATUS_EXPECTATION_FAILED
BG_E_HTTP_ERROR_4490x801901C1
BG_E_HTTP_ERROR_5000x801901F4
HTTP_E_STATUS_SERVER_ERROR
BG_E_HTTP_ERROR_5010x801901F5
HTTP_E_STATUS_NOT_SUPPORTED
BG_E_HTTP_ERROR_5020x801901F6
HTTP_E_STATUS_BAD_GATEWAY
BG_E_HTTP_ERROR_5030x801901F7
HTTP_E_STATUS_SERVICE_UNAVAIL
BG_E_HTTP_ERROR_5040x801901F8
HTTP_E_STATUS_GATEWAY_TIMEOUT
BG_E_HTTP_ERROR_5050x801901F9
HTTP_E_STATUS_VERSION_NOT_SUP

HTTP_E_STATUS系はwinerror.hにあります。ただし、比較的新しいWindows SDKからのようです。Windows SDK 7.1では存在しませんでした。一方、BG_E系はBitsMsg.hに結構前から存在するようです。

なお、FACILITY_HTTPの中にはステータスコードそのままではない値も定義されています。つまり、HRESULからHTTPステータスコードを取り出すときには、FACILITY_HTTPかつHRESULT_CODEの結果が100~599の範囲という条件を課すと良いのではないかと思います。

HTTP_E_STATUS_UNEXPECTED0x80190001
HTTP_E_STATUS_UNEXPECTED_REDIRECTION0x80190003
HTTP_E_STATUS_UNEXPECTED_CLIENT_ERROR0x80190004
HTTP_E_STATUS_UNEXPECTED_SERVER_ERROR0x80190005

HTTP_E_STATUS_UNEXPECTEDは予期せぬステータスコード、後の3つは、それぞれ300番台、400番台、500番台すべてを意味する値のようです。winerror.hには以下のように書かれています。

//
// MessageId: HTTP_E_STATUS_UNEXPECTED
//
// MessageText:
//
// Unexpected HTTP status code.
//
#define HTTP_E_STATUS_UNEXPECTED         _HRESULT_TYPEDEF_(0x80190001L)
 
//
// MessageId: HTTP_E_STATUS_UNEXPECTED_REDIRECTION
//
// MessageText:
//
// Unexpected redirection status code (3xx).
//
#define HTTP_E_STATUS_UNEXPECTED_REDIRECTION _HRESULT_TYPEDEF_(0x80190003L)
 
//
// MessageId: HTTP_E_STATUS_UNEXPECTED_CLIENT_ERROR
//
// MessageText:
//
// Unexpected client error status code (4xx).
//
#define HTTP_E_STATUS_UNEXPECTED_CLIENT_ERROR _HRESULT_TYPEDEF_(0x80190004L)
 
//
// MessageId: HTTP_E_STATUS_UNEXPECTED_SERVER_ERROR
//
// MessageText:
//
// Unexpected server error status code (5xx).
//
#define HTTP_E_STATUS_UNEXPECTED_SERVER_ERROR _HRESULT_TYPEDEF_(0x80190005L)

200番台に対して失敗扱い(SEVERITY_ERROR: 最上位ビットを1)とするのは違和感が拭えないですが、400番台・500番台なら使ってもよいと思いました。

スポンサード リンク

この記事のカテゴリ

  • ⇒ HTTPステータスコードをHRESULTで表現する