o navegador da Web não gosta do xinetd

2

Como posso fazer um serviço xinetd tal que um navegador da web possa confiantemente mostrar sua saída?

O serviço sempre vê a solicitação HTTP GET em seu stdin e envia sua resposta para stdout. o xinetd manipula a conexão tcp.

O Firefox às vezes mostra corretamente a saída. Mas às vezes afirma que o servidor redefiniu a conexão enquanto ainda estava carregando a página. Às vezes, ele mostra toda a saída, mas continua esperando por mais (e quando eu pressiono ESC, ele faz uma nova conexão com o servidor com uma solicitação HTTP vazia).

A definição para o serviço 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
}

O script para este teste simples ignora a entrada, apenas ecoa um html mínimo. Isso causa o mesmo problema que a coisa real, mesmo admitindo que eu adicionei um comando para fechar a stdout no final.

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>'

Como isso é diferente do que um servidor da Web faria?

    
por Klaus Hartnegg 16.09.2015 / 13:20

2 respostas

2

Eu encontrei duas respostas possíveis em Conexão do xinetd 'redefinida pelo peer' :

Acontece que eu devo fazer as duas coisas e mais uma:

  • o servidor deve enviar HTTP/1.0 em vez de HTTP/1.1
  • O servidor deve enviar Content-Length.
  • A saída deve primeiro ser gravada em um arquivo e, em seguida, deve ser enviada com cat

Alguém vê uma maneira mais fácil? O padrão HTTP / 1.1 permite omitir o comprimento do conteúdo e, em vez disso, fechar a conexão. E onde está a diferença entre um cat e uma série de echo de comandos?

    
por 16.09.2015 / 14:06
0

cat ou echo são ambos aceitáveis. Em ambos os casos, os dados são padronizados.

Uma resposta HTTP pode ser enviada com a seguinte função 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
}

Eu escrevi um serviço mini bash-http para o xinetd que pode ser útil.

link

Ele aceita solicitações HTTP / 1.0, incluindo a análise de cabeçalhos HTTP, como a solicitação e os parâmetros HTTP. E retorna uma resposta HTTP apropriada. Também é compatível com linhas de comando.

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
    
por 02.07.2018 / 17:40

Tags