# `http` --- HTTP 模組

原始碼：Lib/http/__init__.py

`http` 是一個收集了多個用於處理超文本傳輸協定 (HyperText Transfer Protocol) 之模組 (module) 的套件：

- `http.client` 是一個低階的 HTTP 協定用戶端；對於高階的 URL 存取請使用 `urllib.request`

- `http.server` 包含基於 `socketserver` 的基本 HTTP 伺服器類別

- `http.cookies` 包含透過 cookies 實作狀態管理的工具程式 (utilities)

- `http.cookiejar` 提供了 cookies 的持續留存 (persistence)

The `http` module also defines the following enums that help you work with http related code:

class http.HTTPStatus

  在 3.5 版被加入.

  `enum.IntEnum` 的子類別，它定義了一組 HTTP 狀態碼、原理短語 (reason phrase) 以及英文長描述。

  用法：

      >>> from http import HTTPStatus
      >>> HTTPStatus.OK
      HTTPStatus.OK
      >>> HTTPStatus.OK == 200
      True
      >>> HTTPStatus.OK.value
      200
      >>> HTTPStatus.OK.phrase
      'OK'
      >>> HTTPStatus.OK.description
      'Request fulfilled, document follows'
      >>> list(HTTPStatus)
      [HTTPStatus.CONTINUE, HTTPStatus.SWITCHING_PROTOCOLS, ...]

## HTTP 狀態碼

`http.HTTPStatus` 當中，已支援並且有於 IANA 註冊的狀態碼有：

狀態碼 | 列舉名稱 | 詳情
--- | --- | ---
`100` | `CONTINUE` | HTTP Semantics RFC 9110, Section 15.2.1
`101` | `SWITCHING_PROTOCOLS` | HTTP Semantics RFC 9110, Section 15.2.2
`102` | `PROCESSING` | WebDAV RFC 2518，10.1 節
`103` | `EARLY_HINTS` | 用於指定提示 (Indicating Hints) RFC 8297 的 HTTP 狀態碼
`200` | `OK` | HTTP Semantics RFC 9110, Section 15.3.1
`201` | `CREATED` | HTTP Semantics RFC 9110, Section 15.3.2
`202` | `ACCEPTED` | HTTP Semantics RFC 9110, Section 15.3.3
`203` | `NON_AUTHORITATIVE_INFORMATION` | HTTP Semantics RFC 9110, Section 15.3.4
`204` | `NO_CONTENT` | HTTP Semantics RFC 9110, Section 15.3.5
`205` | `RESET_CONTENT` | HTTP Semantics RFC 9110, Section 15.3.6
`206` | `PARTIAL_CONTENT` | HTTP Semantics RFC 9110, Section 15.3.7
`207` | `MULTI_STATUS` | WebDAV RFC 4918，11.1 節
`208` | `ALREADY_REPORTED` | WebDAV 繫結擴充 (Binding Extensions) RFC 5842，7.1 節（實驗性）
`226` | `IM_USED` | HTTP 中的差分編碼 RFC 3229，10.4.1 節
`300` | `MULTIPLE_CHOICES` | HTTP Semantics RFC 9110, Section 15.4.1
`301` | `MOVED_PERMANENTLY` | HTTP Semantics RFC 9110, Section 15.4.2
`302` | `FOUND` | HTTP Semantics RFC 9110, Section 15.4.3
`303` | `SEE_OTHER` | HTTP Semantics RFC 9110, Section 15.4.4
`304` | `NOT_MODIFIED` | HTTP Semantics RFC 9110, Section 15.4.5
`305` | `USE_PROXY` | HTTP Semantics RFC 9110, Section 15.4.6
`307` | `TEMPORARY_REDIRECT` | HTTP Semantics RFC 9110, Section 15.4.8
`308` | `PERMANENT_REDIRECT` | HTTP Semantics RFC 9110, Section 15.4.9
`400` | `BAD_REQUEST` | HTTP Semantics RFC 9110, Section 15.5.1
`401` | `UNAUTHORIZED` | HTTP Semantics RFC 9110, Section 15.5.2
`402` | `PAYMENT_REQUIRED` | HTTP Semantics RFC 9110, Section 15.5.3
`403` | `FORBIDDEN` | HTTP Semantics RFC 9110, Section 15.5.4
`404` | `NOT_FOUND` | HTTP Semantics RFC 9110, Section 15.5.5
`405` | `METHOD_NOT_ALLOWED` | HTTP Semantics RFC 9110, Section 15.5.6
`406` | `NOT_ACCEPTABLE` | HTTP Semantics RFC 9110, Section 15.5.7
`407` | `PROXY_AUTHENTICATION_REQUIRED` | HTTP Semantics RFC 9110, Section 15.5.8
`408` | `REQUEST_TIMEOUT` | HTTP Semantics RFC 9110, Section 15.5.9
`409` | `CONFLICT` | HTTP Semantics RFC 9110, Section 15.5.10
`410` | `GONE` | HTTP Semantics RFC 9110, Section 15.5.11
`411` | `LENGTH_REQUIRED` | HTTP Semantics RFC 9110, Section 15.5.12
`412` | `PRECONDITION_FAILED` | HTTP Semantics RFC 9110, Section 15.5.13
`413` | `CONTENT_TOO_LARGE` | HTTP Semantics RFC 9110, Section 15.5.14
`414` | `URI_TOO_LONG` | HTTP Semantics RFC 9110, Section 15.5.15
`415` | `UNSUPPORTED_MEDIA_TYPE` | HTTP Semantics RFC 9110, Section 15.5.16
`416` | `RANGE_NOT_SATISFIABLE` | HTTP Semantics RFC 9110, Section 15.5.17
`417` | `EXPECTATION_FAILED` | HTTP Semantics RFC 9110, Section 15.5.18
`418` | `IM_A_TEAPOT` | HTCPCP/1.0 RFC 2324，Section 2.3.2
`421` | `MISDIRECTED_REQUEST` | HTTP Semantics RFC 9110, Section 15.5.20
`422` | `UNPROCESSABLE_CONTENT` | HTTP Semantics RFC 9110, Section 15.5.21
`423` | `LOCKED` | WebDAV RFC 4918，11.3 節
`424` | `FAILED_DEPENDENCY` | WebDAV RFC 4918，11.4 節
`425` | `TOO_EARLY` | 使用 HTTP 中的早期資料 RFC 8470
`426` | `UPGRADE_REQUIRED` | HTTP Semantics RFC 9110, Section 15.5.22
`428` | `PRECONDITION_REQUIRED` | 額外的 HTTP 狀態碼 RFC 6585
`429` | `TOO_MANY_REQUESTS` | 額外的 HTTP 狀態碼 RFC 6585
`431` | `REQUEST_HEADER_FIELDS_TOO_LARGE` | 額外的 HTTP 狀態碼 RFC 6585
`451` | `UNAVAILABLE_FOR_LEGAL_REASONS` | 一個用來回報合法性障礙 (Legal Obstacles) 的 HTTP 狀態碼 RFC 7725
`500` | `INTERNAL_SERVER_ERROR` | HTTP Semantics RFC 9110, Section 15.6.1
`501` | `NOT_IMPLEMENTED` | HTTP Semantics RFC 9110, Section 15.6.2
`502` | `BAD_GATEWAY` | HTTP Semantics RFC 9110, Section 15.6.3
`503` | `SERVICE_UNAVAILABLE` | HTTP Semantics RFC 9110, Section 15.6.4
`504` | `GATEWAY_TIMEOUT` | HTTP Semantics RFC 9110, Section 15.6.5
`505` | `HTTP_VERSION_NOT_SUPPORTED` | HTTP Semantics RFC 9110, Section 15.6.6
`506` | `VARIANT_ALSO_NEGOTIATES` | HTTP 中的透明內容協商 (Transparent Content Negotiation) RFC 2295，8.1 節（實驗性）
`507` | `INSUFFICIENT_STORAGE` | WebDAV RFC 4918，11.5 節
`508` | `LOOP_DETECTED` | WebDAV 繫結擴充 RFC 5842，7.2 節（實驗性）
`510` | `NOT_EXTENDED` | 一個 HTTP 擴充框架 RFC 2774，7 節（實驗性）
`511` | `NETWORK_AUTHENTICATION_REQUIRED` | 額外的 HTTP 狀態碼 RFC 6585，6 節

為了向後相容性，列舉值也以常數形式出現在 `http.client` 模組中。列舉名稱等於常數名稱（例如 `http.HTTPStatus.OK` 也可以是 `http.client.OK`）。

在 3.7 版的變更: 新增 `421 MISDIRECTED_REQUEST` 狀態碼。

在 3.8 版被加入: 新增 `451 UNAVAILABLE_FOR_LEGAL_REASONS` 狀態碼。

在 3.9 版被加入: 新增 `103 EARLY_HINTS`、`418 IM_A_TEAPOT` 與 `425 TOO_EARLY` 狀態碼。

在 3.13 版的變更: Implemented RFC9110 naming for status constants. Old constant names are preserved for backwards compatibility: `413 REQUEST_ENTITY_TOO_LARGE`, `414 REQUEST_URI_TOO_LONG`, `416 REQUESTED_RANGE_NOT_SATISFIABLE` and `422 UNPROCESSABLE_ENTITY`.

## HTTP 狀態分類

在 3.12 版被加入.

The enum values have several properties to indicate the HTTP status category:

Property | Indicates that | 詳情
--- | --- | ---
`is_informational` | `100 <= status <= 199` | HTTP Semantics RFC 9110, Section 15
`is_success` | `200 <= status <= 299` | HTTP Semantics RFC 9110, Section 15
`is_redirection` | `300 <= status <= 399` | HTTP Semantics RFC 9110, Section 15
`is_client_error` | `400 <= status <= 499` | HTTP Semantics RFC 9110, Section 15
`is_server_error` | `500 <= status <= 599` | HTTP Semantics RFC 9110, Section 15

> 用法：

>     >>> from http import HTTPStatus
>     >>> HTTPStatus.OK.is_success
>     True
>     >>> HTTPStatus.OK.is_client_error
>     False

class http.HTTPMethod

  在 3.11 版被加入.

  `enum.StrEnum` 的子類別，它定義了一組 HTTP 方法以及英文描述。

  用法：

      >>> from http import HTTPMethod
      >>>
      >>> HTTPMethod.GET
      <HTTPMethod.GET>
      >>> HTTPMethod.GET == 'GET'
      True
      >>> HTTPMethod.GET.value
      'GET'
      >>> HTTPMethod.GET.description
      'Retrieve the target.'
      >>> list(HTTPMethod)
      [<HTTPMethod.CONNECT>,
       <HTTPMethod.DELETE>,
       <HTTPMethod.GET>,
       <HTTPMethod.HEAD>,
       <HTTPMethod.OPTIONS>,
       <HTTPMethod.PATCH>,
       <HTTPMethod.POST>,
       <HTTPMethod.PUT>,
       <HTTPMethod.TRACE>]

## HTTP 方法

`http.HTTPMethod` 當中，已支援並且有於 IANA 註冊的狀態碼有：

方法 | 列舉名稱 | 詳情
--- | --- | ---
`GET` | `GET` | HTTP Semantics RFC 9110, Section 9.3.1
`HEAD` | `HEAD` | HTTP Semantics RFC 9110, Section 9.3.2
`POST` | `POST` | HTTP Semantics RFC 9110, Section 9.3.3
`PUT` | `PUT` | HTTP Semantics RFC 9110, Section 9.3.4
`DELETE` | `DELETE` | HTTP Semantics RFC 9110, Section 9.3.5
`CONNECT` | `CONNECT` | HTTP Semantics RFC 9110, Section 9.3.6
`OPTIONS` | `OPTIONS` | HTTP Semantics RFC 9110, Section 9.3.7
`TRACE` | `TRACE` | HTTP Semantics RFC 9110, Section 9.3.8
`PATCH` | `PATCH` | HTTP/1.1 RFC 5789