Existe algum programa de estilo “terminal” que converse com um servidor através de http?

2

Estou à procura de algo que funcione como um terminal, mas que me permita ter um "diálogo" com um servidor através de http. Algo parecido com isto:

$ connect http://myserver.com

Welcome to myserver.com  
Options
A - Fribble the obsticator
B - List Frogits
C - Show the log
Q - Quit

$ A
Obsticator fribbled
blah blah 
blah
$ C
Log file 
...

$ Q
Bye 

Eu não estou procurando por qualquer coisa inteligente que encapsula uma linha de comando unix real sobre http. Nem um navegador de modo de texto. Isso vai falar com um servidor personalizado simples que sabe que está sendo acessado dessa maneira e que retornará texto simples, não html.

Mas deve ser sobre http, não um protocolo diferente. E eu não quero estar fazendo comandos parecidos com curvas como

$ curl http://myserver.com?opt=A

Ele deve conseguir capturar a URL uma vez. E transformar o comando em um argumento CGI deve ser transparente para o usuário.

Atualização: Além disso, não me importo em manter esse diálogo aberto em uma única conexão, cada comando enviado e recebido pode ser uma solicitação http separada. (Na verdade, é melhor porque permite que o servidor seja mais simples)

Atualização 2: O motivo pelo qual eu quero isso é que quero criar uma API simples e pequena de serviço da Web usando o Python Hug ( link ), mas seria conveniente ter acesso a algumas de suas ações diretamente da linha de comando, em vez do navegador.

Em vez de adicionar a complexidade extra, de falar um protocolo diferente e gerenciar um ouvinte de interação separado, no servidor, seria bom ter um cliente de linha de comando simples para conversar com a API com solicitações http padrão.

Então, há algo assim? (Antes de me sentar e escrever um.)

    
por interstar 16.09.2016 / 17:08

4 respostas

3

Você pode usar o telnet para se conectar ao servidor, sabendo que ( Estou assumindo aqui que você deseja usar um servidor da Web para se comunicar com) você precisará operar dentro das restrições da especificação HTTP.
Por exemplo, a especificação link
afirma:

Origin servers MUST include a Date header field in all responses, except in these cases: ...

aqui é a saída do terminal de uma "conversa" que tive com um servidor da Web sobre o telnet.
Tendo em mente que a configuração dos servidores web determinará por quanto tempo a conexão TCP será mantida ativa - ou seja, o tempo que você tem para digitar uma requisição HTTP devidamente formada antes que o servidor rompa a conexão TCP devido a "inatividade". mas isso é configurável.
Se você inserir cada solicitação antes do tempo limite, estará basicamente enviando muitas solicitações e respostas HTTP através de uma única conexão TCP contínua.

% telnet localhost 80
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
GET / HTTP/1.1           <---- this in where you type characters "interactively"            
Host: localhost          <---- this in where you type characters "interactively"
                         <-- per the HTTP specification this has to be an emtpy line
                             to tell the server you are done with your "message"



HTTP/1.1 200 OK
Server: nginx/1.10.0 (Ubuntu)
Date: Sat, 17 Sep 2016 07:38:08 GMT
Content-Type: text/html
Transfer-Encoding: chunked
Connection: keep-alive

45d
<html>
[truncated ... ]
</html>


0                      

GET / HTTP/1.1         <-- now you are back at prompt
Host: localhost            Note: you need to enter the 'Host' header if you are talking 
                           to a webserver
HTTP/1.1 200 OK
Server: nginx/1.10.0 (Ubuntu)
Date: Sat, 17 Sep 2016 07:41:07 GMT
Content-Type: text/html
Transfer-Encoding: chunked
Connection: keep-alive

45d
<html>
[truncated]

Obviamente, para obter um "diálogo" mais limpo, você precisaria limpar a saída do servidor da Web ou do seu aplicativo que estaria lidando com as solicitações.

O nginx ttp_core_module é responsável por gerenciar o tipo padrão usando o link do Yahoo!

Para adicionar cabeçalhos, você pode usar o http_headers_module link

    
por 17.09.2016 / 10:44
2

Contanto que você não se importe em usar curl como seu back-end, e não queira digitar o URL inteiro toda vez, pode executar curl em um loop, algo assim :

read -p "Server name: " s && curl -fs "$s" && while true; do read -p "$ " x && curl -fs "$s?opt=${x^^}" || break; done

que também se encaixaria muito bem em um alias se você não quisesse digitar ou colar tudo em cada vez.

Não há muita verificação de erros, o que provavelmente é bom se você quer apenas uma maneira fácil de conversar com seu próprio servidor confiável e não está tentando hackear seu próprio script. Um script mais avançado pode validar o nome do servidor ou tentar analisar as páginas da web retornadas antes de exibi-las, e é claro que ambos os lados devem se defender contra entradas não confiáveis.

Eu adicionei duas opções a curl :

  • -f sairá com um código de erro 21 se a página da web retornar erro 400 ou acima (útil para o comando quit )
  • -s modo silencioso não mostrará dados de conexão para cada comando.

Além disso, você verá exatamente o que seu servidor gera para cada consulta.

    
por 17.09.2016 / 07:00
1

OK.

Inspirado na resposta de @drewbenn, eu mesmo escrevi em Python, usando a biblioteca Solicitações ( link ):

import requests
import sys

url = sys.argv[1]
print "Connecting ", url

r = requests.get(url)
print r.text
flag = True
while flag :
    s = raw_input()
    data = {"opt": s}
    r = requests.get(url, params=data)
    print r.text
    
por 18.09.2016 / 05:47
1

Se é uma API HTTP RESTful, particularmente da variedade HATEOAS, então você poderia usar o shell de descanso do Spring

link

Exemplo de uso:

http://localhost:8080:> discover
rel                href
========================================================
address            http://localhost:8080/address
family             http://localhost:8080/family
people             http://localhost:8080/person
profile            http://localhost:8080/profile

http://localhost:8080:> follow people
http://localhost:8080/person:> list
rel             href
===================================================
people.Person    http://localhost:8080/person/1
people.Person    http://localhost:8080/person/2
people.search    http://localhost:8080/person/search

http://localhost:8080/person:> get 1
...
    
por 23.09.2016 / 01:28