如何使用Bash解析HTTP标头?

jpshook:

我需要从正在使用curl的网页标题中获取2个值。我已经能够使用以下方法分别获取值:

response1=$(curl -I -s http://www.example.com | grep HTTP/1.1 | awk {'print $2'})
response2=$(curl -I -s http://www.example.com | grep Server: | awk {'print $2'})

但是我无法弄清楚如何使用单个curl请求像下面那样分别grep值:

response=$(curl -I -s http://www.example.com)
http_status=$response | grep HTTP/1.1 | awk {'print $2'}
server=$response | grep Server: | awk {'print $2'}

每次尝试都会导致错误消息或空值。我确信这只是一个语法问题。

西尔万·勒鲁(Sylvain Leroux):

完整的bash解决方案。演示如何轻松解析其他标头,而无需执行以下操作awk

shopt -s extglob # Required to trim whitespace; see below

while IFS=':' read key value; do
    # trim whitespace in "value"
    value=${value##+([[:space:]])}; value=${value%%+([[:space:]])}

    case "$key" in
        Server) SERVER="$value"
                ;;
        Content-Type) CT="$value"
                ;;
        HTTP*) read PROTO STATUS MSG <<< "$key{$value:+:$value}"
                ;;
     esac
done < <(curl -sI http://www.google.com)
echo $STATUS
echo $SERVER
echo $CT

生产:

302
GFE/2.0
text/html; charset=UTF-8

根据RFC-2616,HTTP标头按照“ ARPA Internet文本消息格式标准”(RFC822)中所述进行建模,其中明确指出了第3.1.2节:

字段名称必须由可打印的ASCII字符组成(即,冒号除外,其值在33.到126.之间的字符,十进制)。字段主体可以由任何ASCII字符组成,CR或LF除外。(尽管CR和/或LF可能出现在实际文本中,但通过展开字段的动作将其删除。)

因此,以上脚本捕获任何符合RFC- [2] 822的标头,但应注意折叠标头除外

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章