web-dev-qa-db-ja.com

Webブラウザはxinetdを嫌います

Webブラウザが確実に出力を表示できるようにxinetdサービスを作成するにはどうすればよいですか?

サービスは常にstdinでHTTPGET要求を確認し、その応答をstdoutに送信します。 xinetdはtcp接続を処理します。

Firefox 時々出力を正しく表示します。ただし、サーバーがページの読み込み中に接続をリセットしたと主張する場合があります。すべての出力が表示されることもありますが、それ以上待機し続けます(その後、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サーバーが行うこととどのように異なりますか?

2
Klaus Hartnegg

xinetd '接続がピアによってリセットされました' で2つの可能な答えが見つかりました:

両方、さらにもう1つ実行する必要があることがわかりました。

  • サーバーはHTTP/1.0ではなくHTTP/1.1を送信する必要があります
  • サーバーはContent-Lengthを送信する必要があります。
  • 出力は最初にファイルに書き込まれ、次にcatで送信される必要があります

誰かがもっと簡単な方法を見ていますか?私見では、HTTP/1.1標準では、Content-Lengthを省略して、代わりに接続を閉じることができます。そして、1つのcatコマンドと一連のechoコマンドの違いはどこにありますか?

2
Klaus Hartnegg

猫またはエコーの両方が許容されます。どちらの場合も、データは標準出力になります。

HTTP応答は、次のbash関数を使用して送信できます。

#
# 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リクエストやパラメータなどのHTTPヘッダーの解析を含むHTTP/1.0リクエストを受け入れます。そして、適切な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
1
Russell E Glaue