网络浏览器不喜欢 xinetd

网络浏览器不喜欢 xinetd

如何创建 xinetd 服务以便 Web 浏览器可以可靠地显示其输出?

该服务始终在其 stdin 上看到 HTTP GET 请求,并将其答复发送到 stdout。xinetd 处理 tcp 连接。

火狐有时正确显示输出。但有时它会声称服务器在仍在加载页面时重置了连接。有时它会显示所有输出,但会继续等待更多输出(然后当我按下 ESC 时,它会使用空的 HTTP 请求与服务器建立新连接)。

xinetd 服务的定义是:

service test
{
    disable = no
    id              = test
    type            = UNLISTED
    port            = 8043
    wait            = no
    socket_type     = stream
    flags           = IPv4
    user            = root
    server          = /usr/local/bin/test.sh
}

这个简单测试的脚本忽略了输入,只回显了一个最小的 html。它会导致与真实情况相同的问题,尽管我在最后添加了一个关闭 stdout 的命令。

echo 'HTTP/1.1 200 OK'
echo 'Content-Type: text/html; charset=UTF-8'
echo ''
echo '<html>'
echo '<body style="background:#dfd">'
echo '<b>hello, world!</b><br>'
echo `date`
echo '</body>'
echo '</html>'

这与 Web 服务器所做的有何不同?

答案1

我找到了两个可能的答案 xinetd‘对方重置连接’

事实证明我必须同时做这两件事,另外还要做一件事:

  • 服务器必须HTTP/1.0发送HTTP/1.1
  • 服务器必须发送 Content-Length。
  • 输出必须先写入文件,然后必须发送cat

有人看到更简单的方法吗?恕我直言,HTTP/1.1 标准确实允许省略 Content-Length 并关闭连接。一个命令cat和一系列echo命令之间的区别在哪里?

答案2

cat 或 echo 都是可以接受的。在这两种情况下,数据都会进入标准输出。

可以使用以下 bash 函数发送 HTTP 响应:

#
# The HTTP response
# Syntax:  http_response 200 "Success Message" 
#          http_response 503 "Service Unavailable Message" 
#
http_response () {
    HTTP_CODE=$1
    MESSAGE=${2:-Message Undefined}
    length=${#MESSAGE}
    if [ "$HTTP_CODE" -eq 503 ]; then
      echo -en "HTTP/1.1 503 Service Unavailable\r\n" 
    elif [ "$HTTP_CODE" -eq 200 ]; then
      echo -en "HTTP/1.1 200 OK\r\n" 
    else
      echo -en "HTTP/1.1 ${HTTP_CODE} UNKNOWN\r\n" 
    fi
    echo -en "Content-Type: text/plain\r\n" 
    echo -en "Connection: close\r\n" 
    echo -en "Content-Length: ${length}\r\n" 
    echo -en "\r\n" 
    echo -en "$MESSAGE"
    echo -en "\r\n" 
    sleep 0.1
    exit 0
}

我为 xinetd 编写了一个迷你 bash-http 服务,可能会有帮助。

http://github.com/rglaue/xinetd_bash_http_service

它接受 HTTP/1.0 请求,包括解析 HTTP 请求和参数等 HTTP 标头。并返回适当的 HTTP 响应。它也是命令行友好的。

bash~$ echo "GET /weight-value?inverse-weight=0&max-weight=100 HTTP/1.0" | xinetdhttpservice.sh --http-status
HTTP/1.1 200 OK
Content-Type: text/plain
Connection: close
Content-Length: 15

WEIGHT_VALUE=99

相关内容