我正试图使用socat制作一个http代理,但我不知道为什么请求突然停止,网页中也没有任何内容。它只是将HTTP请求从bowser传输到web服务器。然后回复。
socat TCP4-LISTEN:666,fork EXEC:"./httproxy.sh"
将端口80重定向到666
iptables -t nat -A PREROUTING -p tcp --destination-port 80 -j REDIRECT --to-port 666
httproxy.sh
#!/usr/bin/env bash
function main() {
REQUEST_HEADERS=()
read -r line
line=${line%%$'r'}
read -r REQUEST <<< "${line}"
while IFS= read -r line; do
line=${line%%$'r'}
[ -z "${line}" ] && break
REQUEST_HEADERS+=( "${line}" )
done
printf "${REQUEST}rn" &> request.log
for ((i = 0; i < ${#REQUEST_HEADERS[@]}; i++)); do
[[ "${REQUEST_HEADERS[$i]}" =~ ^Host:[[:space:]](.*) ]] && IP=${BASH_REMATCH[1]}
printf "${REQUEST_HEADERS[$i]}rn" &>> request.log
done
printf "$(cat request.log)rnrnrn" | nc ${IP} 80
}
main
响应:
HTTP/1.1 200 OK....
{HTTP Content}
Immediately after the content:
HTTP/1.1 405....
我已经用很多"Http"网页测试过了,有时html内容会到达。请帮帮我。
不要将变量放在printf
格式字符串中打印。
代替
printf "$varrn"
进行
printf '%srn' "$var"
根据经验,用单引号将格式字符串括起来,这样可以防止任何无意的变量或进程替换。
当然,printf "$(cat request.log)rnrnrn"
也是如此
为什么?
- 如果
var
以-
(减号(开头,printf将把您的格式字符串理解为一个选项。HTTP GET请求永远不会发生这种情况 - 如果
var
包含%
字符,这在HTTP请求中非常常见,printf将把它解释为一个格式指令
此外,您可能在请求后添加了太多的空行rn
。一个似乎足够了,因为你用已经以rn
:结束的行来附加request.log
{ cat request.log; printf 'rn'; } | nc ...
(可能你甚至不需要添加任何空行,因为请求应该已经以一行结束(