关于 bash:CGI 的 CONTENT_LENGTH 变量是什么?

What is the CONTENT_LENGTH varaible of a CGI?

RFC 3875 以这种方式定义 CONTENT_LENGTH:

The CONTENT_LENGTH variable contains the size of the message-body
attached to the request, if any, in decimal number of octets. If no
data is attached, then NULL (or unset).

1
CONTENT_LENGTH ="" | 1*digit

The server MUST set this meta-variable if and only if the request is
accompanied by a message-body entity. The CONTENT_LENGTH value must
reflect the length of the message-body after the server has removed
any transfer-codings or content-codings.

我不确定这是什么尺寸。

是客户端要发送的数据的大小,即HTTP请求头"Content-Length"的值吗?

或者是HTTP服务器在数据发送到CGI之前从请求中读取的数据的大小?

我问是因为我不确定谁负责检查,客户端要发送的数据量与实际到达的数据量相匹配。 HTTP 服务器是否负责检查大小是否与请求标头中的值匹配,或者 CGI 是否负责计算到达 STDIN 的字节数?如果是这样,如何获取 CGI 请求标头的值?

现在我在我的 CGI 中执行此操作:

1
2
3
4
5
6
cat > $TMP/upload.csv
size=$(stat -c %s"$TMP/upload.csv")
if ["$CONTENT_LENGTH" !="$size" ]; then
  echo"Size missmatch"
  return -1
fi

但是这样做对吗?


这里已经讨论过 HTTP Content-Length 什么是 HTTP 标头中的"Content-Length"字段?仅为 HTTP 的协议范围定义正文部分的长度。

如果你的 body 是二进制传输的,the Content-LengthHTTP 请求中的数据长度相同。

当你的正文是 7 位 ASCII 编码时,Content-Length 通常高于实际数据。

总结:Content-Length 需要在发送 HTTP 请求的主体之前计算。

在您的情况下,您可能不会将 Content-Length 与文件长度进行比较。这些是断开连接的值。

您的文件可能会与多个 HTTP 请求和带有部分内容的答案一起传输,并且每个 HTTP 请求和答案都会得到自己的 Content-Length

如果您的意图是进行完整性检查;然后使用 HTTPS 进行传输完整性检查,或使用校验和,或其他协议,如带有内置完整性检查的 rsync