无法在递归shell函数中进行curl POST ..?

时间:2015-12-01 09:48:24

标签: bash shell curl recursion

我正在尝试对URL进行curl POST,这可能会导致一系列重定向(301)到受BASIC身份验证保护的实际URL。事实证明-L选项在这种情况下无济于事,我想我会尝试编写一个带有递归函数的特定于案例的shell脚本,只是为了证明这个概念。这是脚本:

#!/bin/sh

WORK_DIR=/some/dir
MY_URL=http://redirect.me/some/service
MY_FILE=output.bin

follow_redirect() {

echo "Input URL is $1"

local status_code="$(curl -s -X POST --data-binary @${WORK_DIR}/postdata.txt -u myuser:mypass \
-o ${WORK_DIR}/${MY_FILE} -D ${WORK_DIR}/headers.out -w "%{http_code}" "$1" --header "X-Custom-Header:Whatever")"

echo "Status code is $status_code"

if [ $status_code -eq "301" ]; then
  # extract Location header value
  local loc_line="$(cat ${WORK_DIR}/headers.out | grep Location)"
  local sub_url=${loc_line:10}
  echo "HTTP redirect to: $sub_url"
  follow_redirect "$sub_url"
elif [ $status_code -eq "200" ]; then
  echo "HTTP OK"
  return
else
  echo "HTTP request failed"
  return
fi

}

# do the call
follow_redirect "$MY_URL"

简短描述:想法是尝试进行调用,并获取状态代码。如果代码是301,则执行递归调用,传入以前从Location标头中提取的新URL(标头被转储到临时文件中,如可以看到的)。

我得到的是输出结果:

Input URL is http://redirect.me/some/service
Status code is 301
HTTP redirect to: http://actual.url/some/service
Input URL is http://actual.url/some/service
Status code is 000
HTTP request failed

出于某种原因,第一次递归curl调用失败,状态代码为000,就好像我传入了一个空输入网址,或者其他内容(但输入网址实际打印得正确)。我还尝试用硬编码值替换所有参数化文件系统路径,以确保它不是那里的东西,但结果是相同的。我在这里做错了什么想法......?

1 个答案:

答案 0 :(得分:0)

实际上,仅使用curl似乎解决了这个问题,不仅指定了--location-trusted而且还指定了--post301,以便保留原始POST请求,使其不会被转换在重定向时获取。                      - 减