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

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

定数名
BG_E_HTTP_ERROR_100 0x80190064
BG_E_HTTP_ERROR_101 0x80190065
BG_E_HTTP_ERROR_200 0x801900C8
BG_E_HTTP_ERROR_201 0x801900C9
BG_E_HTTP_ERROR_202 0x801900CA
BG_E_HTTP_ERROR_203 0x801900CB
BG_E_HTTP_ERROR_204 0x801900CC
BG_E_HTTP_ERROR_205 0x801900CD
BG_E_HTTP_ERROR_206 0x801900CE
BG_E_HTTP_ERROR_300 0x8019012C
HTTP_E_STATUS_AMBIGUOUS
BG_E_HTTP_ERROR_301 0x8019012D
HTTP_E_STATUS_MOVED
BG_E_HTTP_ERROR_302 0x8019012E
HTTP_E_STATUS_REDIRECT
BG_E_HTTP_ERROR_303 0x8019012F
HTTP_E_STATUS_REDIRECT_METHOD
BG_E_HTTP_ERROR_304 0x80190130
HTTP_E_STATUS_NOT_MODIFIED
BG_E_HTTP_ERROR_305 0x80190131
HTTP_E_STATUS_USE_PROXY
BG_E_HTTP_ERROR_307 0x80190133
HTTP_E_STATUS_REDIRECT_KEEP_VERB
BG_E_HTTP_ERROR_400 0x80190190
HTTP_E_STATUS_BAD_REQUEST
BG_E_HTTP_ERROR_401 0x80190191
HTTP_E_STATUS_DENIED
BG_E_HTTP_ERROR_402 0x80190192
HTTP_E_STATUS_PAYMENT_REQ
BG_E_HTTP_ERROR_403 0x80190193
HTTP_E_STATUS_FORBIDDEN
BG_E_HTTP_ERROR_404 0x80190194
HTTP_E_STATUS_NOT_FOUND
BG_E_HTTP_ERROR_405 0x80190195
HTTP_E_STATUS_BAD_METHOD
BG_E_HTTP_ERROR_406 0x80190196
HTTP_E_STATUS_NONE_ACCEPTABLE
BG_E_HTTP_ERROR_407 0x80190197
HTTP_E_STATUS_PROXY_AUTH_REQ
BG_E_HTTP_ERROR_408 0x80190198
HTTP_E_STATUS_REQUEST_TIMEOUT
BG_E_HTTP_ERROR_409 0x80190199
HTTP_E_STATUS_CONFLICT
BG_E_HTTP_ERROR_410 0x8019019A
HTTP_E_STATUS_GONE
BG_E_HTTP_ERROR_411 0x8019019B
HTTP_E_STATUS_LENGTH_REQUIRED
BG_E_HTTP_ERROR_412 0x8019019C
HTTP_E_STATUS_PRECOND_FAILED
BG_E_HTTP_ERROR_413 0x8019019D
HTTP_E_STATUS_REQUEST_TOO_LARGE
BG_E_HTTP_ERROR_414 0x8019019E
HTTP_E_STATUS_URI_TOO_LONG
BG_E_HTTP_ERROR_415 0x8019019F
HTTP_E_STATUS_UNSUPPORTED_MEDIA
BG_E_HTTP_ERROR_416 0x801901A0
HTTP_E_STATUS_RANGE_NOT_SATISFIABLE
BG_E_HTTP_ERROR_417 0x801901A1
HTTP_E_STATUS_EXPECTATION_FAILED
BG_E_HTTP_ERROR_449 0x801901C1
BG_E_HTTP_ERROR_500 0x801901F4
HTTP_E_STATUS_SERVER_ERROR
BG_E_HTTP_ERROR_501 0x801901F5
HTTP_E_STATUS_NOT_SUPPORTED
BG_E_HTTP_ERROR_502 0x801901F6
HTTP_E_STATUS_BAD_GATEWAY
BG_E_HTTP_ERROR_503 0x801901F7
HTTP_E_STATUS_SERVICE_UNAVAIL
BG_E_HTTP_ERROR_504 0x801901F8
HTTP_E_STATUS_GATEWAY_TIMEOUT
BG_E_HTTP_ERROR_505 0x801901F9
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_UNEXPECTED 0x80190001
HTTP_E_STATUS_UNEXPECTED_REDIRECTION 0x80190003
HTTP_E_STATUS_UNEXPECTED_CLIENT_ERROR 0x80190004
HTTP_E_STATUS_UNEXPECTED_SERVER_ERROR 0x80190005

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で表現する