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サーバーが行うこととどのように異なりますか?
xinetd '接続がピアによってリセットされました' で2つの可能な答えが見つかりました:
両方、さらにもう1つ実行する必要があることがわかりました。
HTTP/1.0
ではなくHTTP/1.1
を送信する必要がありますcat
で送信される必要があります誰かがもっと簡単な方法を見ていますか?私見では、HTTP/1.1標準では、Content-Lengthを省略して、代わりに接続を閉じることができます。そして、1つのcat
コマンドと一連のecho
コマンドの違いはどこにありますか?
猫またはエコーの両方が許容されます。どちらの場合も、データは標準出力になります。
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