# 21.11. `http` — HTTP模块

源码: Lib/http/__init__.py

`http`包用于处理超文本传输协议，包括下面几个模块：

- `http.client`是低级别的HTTP协议客户端，对于高级别的URL开发请参考 `urllib.request`。
- `http.server` 包含基于`socketserver`的基本HTTP服务类。
- `http.cookies` 用于实现cookie状态管理。
- `http.cookiejar` 提供持久化cookie。

`http`本身也是一个模块，它通过枚举类 `http.HTTPStatus`定义了一系列的HTTP状态码和相关信息。

class `http.``HTTPStatus`

  版本3.5中的新功能。

  是 `enum.IntEnum`的子类，定义了一系列的HTTP状态码、原因短语和长文本描述。

  示例:

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

## 21.11.1. HTTP状态码

`http.HTTPStatus` 中支持的状态码列表如下： （都已注册IANA，参考：IANA-registered）

码 | 枚举名称 | 细节
--- | --- | ---
`100` | `CONTINUE` | HTTP / 1.1 RFC 7231，第6.2.1节
`101` | `SWITCHING_PROTOCOLS` | HTTP / 1.1 RFC 7231，第6.2.2节
`102` | `PROCESSING` | WebDAV RFC 2518，第10.1节
`200` | `OK` | HTTP / 1.1 RFC 7231，第6.3.1节
`201` | `CREATED` | HTTP / 1.1 RFC 7231，第6.3.2节
`202` | `ACCEPTED` | HTTP / 1.1 RFC 7231，第6.3.3节
`203` | `NON_AUTHORITATIVE_INFORMATION` | HTTP / 1.1 RFC 7231，第6.3.4节
`204` | `NO_CONTENT` | HTTP / 1.1 RFC 7231，第6.3.5节
`205` | `RESET_CONTENT` | HTTP / 1.1 RFC 7231，第6.3.6节
`206` | `PARTIAL_CONTENT` | HTTP / 1.1 RFC 7233，第4.1节
`207` | `MULTI_STATUS` | WebDAV RFC 4918，第11.1节
`208` | `ALREADY_REPORTED` | WebDAV绑定扩展 RFC 5842，第7.1节（实验）
`226` | `IM_USED` | HTTP中的增量编码 RFC 3229，第10.4.1节
`300` | `MULTIPLE_CHOICES` | HTTP / 1.1 RFC 7231，第6.4.1节
`301` | `MOVED_PERMANENTLY` | HTTP / 1.1 RFC 7231，第6.4.2节
`302` | `FOUND` | HTTP / 1.1 RFC 7231，第6.4.3节
`303` | `SEE_OTHER` | HTTP / 1.1 RFC 7231，第6.4.4节
`304` | `NOT_MODIFIED` | HTTP / 1.1 RFC 7232，第4.1节
`305` | `USE_PROXY` | HTTP / 1.1 RFC 7231，第6.4.5节
`307` | `TEMPORARY_REDIRECT` | HTTP / 1.1 RFC 7231，第6.4.7节
`308` | `PERMANENT_REDIRECT` | 永久重定向 RFC 7238，第3节（实验）
`400` | `BAD_REQUEST` | HTTP / 1.1 RFC 7231，第6.5.1节
`401` | `UNAUTHORIZED` | HTTP / 1.1认证 RFC 7235，第3.1节
`402` | `PAYMENT_REQUIRED` | HTTP / 1.1 RFC 7231，第6.5.2节
`403` | `FORBIDDEN` | HTTP / 1.1 RFC 7231，第6.5.3节
`404` | `NOT_FOUND` | HTTP / 1.1 RFC 7231，第6.5.4节
`405` | `METHOD_NOT_ALLOWED` | HTTP / 1.1 RFC 7231，第6.5.5节
`406` | `NOT_ACCEPTABLE` | HTTP / 1.1 RFC 7231，第6.5.6节
`407` | `PROXY_AUTHENTICATION_REQUIRED` | HTTP / 1.1认证 RFC 7235，第3.2节
`408` | `REQUEST_TIMEOUT` | HTTP / 1.1 RFC 7231，第6.5.7节
`409` | `CONFLICT` | HTTP / 1.1 RFC 7231，第6.5.8节
`410` | `GONE` | HTTP / 1.1 RFC 7231，第6.5.9节
`411` | `LENGTH_REQUIRED` | HTTP / 1.1 RFC 7231，第6.5.10节
`412` | `PRECONDITION_FAILED` | HTTP / 1.1 RFC 7232，第4.2节
`413` | `REQUEST_ENTITY_TOO_LARGE` | HTTP / 1.1 RFC 7231，第6.5.11节
`414` | `REQUEST_URI_TOO_LONG` | HTTP / 1.1 RFC 7231，第6.5.12节
`415` | `UNSUPPORTED_MEDIA_TYPE` | HTTP / 1.1 RFC 7231，第6.5.13节
`416` | `REQUEST_RANGE_NOT_SATISFIABLE` | HTTP / 1.1范围请求 RFC 7233，第4.4节
`417` | `EXPECTATION_FAILED` | HTTP / 1.1 RFC 7231，第6.5.14节
`422` | `UNPROCESSABLE_ENTITY` | WebDAV RFC 4918，第11.2节
`423` | `LOCKED` | WebDAV RFC 4918，第11.3节
`424` | `FAILED_DEPENDENCY` | WebDAV RFC 4918，第11.4节
`426` | `UPGRADE_REQUIRED` | HTTP / 1.1 RFC 7231，第6.5.15节
`428` | `PRECONDITION_REQUIRED` | 其他HTTP状态码 RFC 6585
`429` | `TOO_MANY_REQUESTS` | 其他HTTP状态码 RFC 6585
`431` | `REQUEST_HEADER_FIELDS_TOO_LARGE` | 其他HTTP状态码 RFC 6585
`500` | `INTERNAL_SERVER_ERROR` | HTTP / 1.1 RFC 7231，第6.6.1节
`501` | `NOT_IMPLEMENTED` | HTTP / 1.1 RFC 7231，第6.6.2节
`502` | `BAD_GATEWAY` | HTTP / 1.1 RFC 7231，第6.6.3节
`503` | `SERVICE_UNAVAILABLE` | HTTP / 1.1 RFC 7231，第6.6.4节
`504` | `GATEWAY_TIMEOUT` | HTTP / 1.1 RFC 7231，第6.6.5节
`505` | `HTTP_VERSION_NOT_SUPPORTED` | HTTP / 1.1 RFC 7231，第6.6.6节
`506` | `VARIANT_ALSO_NEGOTIATES` | HTTP中的透明内容协商 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`。