netkit/http/metadata

这个模块定义了一个通用对象 HttpMetadata ,该对象抽象了 HTTP 以简化对元数据的使用。

概述

HTTP 消息支持挂载元数据。当前,有两种类型的元数据,都出现在 chunked 编码的消息。它们是:

  • Chunk Extensions
  • Trailers

Chunk Extensions

经过 chunked 编码的消息,每个数据块可以包含零个到多个块扩展。这些扩展紧跟在块大小之后,提供块的元数据(例如签名或哈希)。

每个扩展都是一个以 = 作为分隔符的名称/值对,例如 language = en; 多个扩展名以 ';' 作为分隔符组合在一起,例如 language=en; city=London

例子:

HTTP/1.1 200 OK
Transfer-Encoding: chunked

9; language=en; city=London\r\n
Developer\r\n
0\r\n
\r\n

Trailers

经过 chunked 编码的消息,可以在尾部挂载元数据 trailers。trailers 实际上是一个或多个 HTTP 响应头字段,允许发送方在消息末尾添加其他元信息。 这些元信息可以随着消息正文的发送而动态生成,例如消息完整性检查,消息数字签名或处理后消息的最终状态等。

注意:仅当客户端在请求头包含 TE``( ``TE:trailers )时,服务器才能在响应中挂载 trailers。

例子:

HTTP/1.1 200 OK
Transfer-Encoding: chunked
Trailer: Expires

9\r\n
Developer\r\n
0\r\n
Expires: Wed, 21 Oct 2015 07:28:00 GMT\r\n
\r\n

用法

出于性能方面的考虑, HttpMetadata 不会进一步解析 trailersextensions 的内容。 您可以使用 parseChunkTrailersparseChunkExtensions 分别提取它们的内容。

Chunk Extensions

提取内容:

import netkit/http/metadata
import netkit/http/chunk

let metadata = HttpMetadata(
  kind: HttpMetadataKind.ChunkExtensions,
  extensions: "; a1=v1; a2=v2"
)
let extensions = parseChunkExtensions(metadata.extensions)
assert extensions[0].name = "a1"
assert extensions[0].value = "v1"
assert extensions[1].name = "a2"
assert extensions[1].value = "v2"

Trailers

提取内容:

import netkit/http/metadata
import netkit/http/chunk

let metadata = HttpMetadata(
  kind: HttpMetadataKind.ChunkTrailers,
  trailers: @["Expires: Wed, 21 Oct 2015 07:28:00 GMT"]
)
let tailers = parseChunkTrailers(metadata.trailers)
assert tailers["Expires"][0] == "Wed, 21 Oct 2015 07:28:00 GMT"

Types

HttpMetadataKind{...}{.pure.} = enum
  None,
  ChunkTrailers,
  ChunkExtensions
元数据的类型。   Source Edit
HttpMetadata = object
  case kind*: HttpMetadataKind
  of HttpMetadataKind.ChunkTrailers:
      trailers*: seq[string]

  of HttpMetadataKind.ChunkExtensions:
      extensions*: string

  of HttpMetadataKind.None:
      nil

  
元数据对象。   Source Edit