Seu desafio é escrever um servidor HTTP code-golf que aceite solicitações GET. Obviamente, ele não precisa ter todos os recursos, mas deve servir arquivos de um diretório.
Regras:
- O servidor HTTP deve escutar na porta TCP 36895 (0x901F)
- Ele deve servir arquivos de
/var/www
sistemas * NIX (por exemplo, Linux) ouC:\hgolf
Windows. - Você pode ignorar todos os cabeçalhos HTTP recebidos, exceto o
GET
próprio. - Se o método HTTP não for GET, você deverá enviar de volta um código de status "405 Não Suportado" e um corpo de "405 Não Suportado".
- Se o arquivo não existir, você deve enviar um código de status "Arquivo 404 não encontrado" e um corpo de "Arquivo 404 não encontrado".
- Se o arquivo existir, mas não puder ser lido por algum motivo, você deve enviar de volta um código de status "500 Server Error" e um corpo de "500 Server Error".
- Se o usuário solicitar
/
ou qualquer outra raiz de diretório existente (por exemplo,/foo/
ondefoo
existe um diretório/var/www/
), responda com uma página em branco. - Sua resposta deve conter pelo menos os cabeçalhos mínimos para permitir que o conteúdo seja exibido no Firefox 8.0 e Internet Explorer 8.0
- Você deve responder com o
Content-Type
conjunto de cabeçalhos, mas você só precisa oferecer suporte a extensõeshtml => text/html
etxt => text/plain
. Para qualquer outra extensão de arquivo, envieapplication/octet-stream
como o tipo de conteúdo. - Seu código deve ser capaz de transferir dados binários e ASCII, embora você não precise explicitamente distinguir entre os dois.
- Você não pode usar bibliotecas de terceiros.
- Você não pode usar classes ou recursos internos projetados para processar solicitações HTTP (por exemplo,
HttpListener
em C #) - Se seu código funcionará apenas em um sistema operacional específico devido às APIs de soquete usadas, indique isso.
As soluções devem incluir uma imagem mostrando a veiculação de uma página HTML em um navegador.
Se você tiver alguma dúvida, não hesite em perguntar! :)
..
no caminho como uma maneira de romper com a raiz do documento definida).http
módulo no Node.js está ok?Respostas:
Ruby, 383 caracteres
A reestruturação do código para agrupar a lógica essencial em uma linha, o que torna o código mais curto. No entanto, espero que esta versão possa ser um pouco mais desenvolvida.
Nota: Eu ainda não implementei o "500 Server Error" porque não consegui encontrar uma estrutura apropriada (talvez empacotando tudo em begin / rescue / end, mas a leitura do arquivo seja feita após o envio do cabeçalho).
fonte
500 Server Error
ele não se encaixa nos requisitos, portanto, não deve ser aceito.Bash + netcat: 354 caracteres
webserver.sh (33 caracteres):
w (321 caracteres):
Exemplo de execução:
Visita de amostra (Firefox 19.0):
fonte
nc
me diz que a opção -e não é suportada. Alguma ideia?nc
do BusyBox. Eu uso o GNUnetcat
.text/plain
?netcat
.)Haskell, 636
Os arquivos são transmitidos preguiçosamente, portanto, a veiculação de arquivos grandes não utiliza muita memória, mas isso também significa que apenas erros no início da transmissão (por exemplo, erros de permissão) resultam em a
500 Server Error
.Testado no Ubuntu 10.10. Pode ser portado para o Windows alterando o
/var/www
paraC:/hgolf
e mudandomain=
paramain=withSocketsDo$
, pois a biblioteca de soquetes no Windows requer inicialização explícita.Versão não destruída:
fonte
Caracteres do Python 2,
525 510493 (dobrando as regras 483)Afirmei que só preciso de 483 caracteres se dobrar as regras porque o último
;c.close()
pode ser omitido. Isso ocorre porque, no momento em que o próximo cliente é aceito, o soquete é fechado de qualquer maneira. Obviamente, isso aumentará um pouco o tempo de espera (o Firefox exibirá a página apenas quando o próximo cliente se conectar, o Chrome exibirá antes, mas continuará carregando), mas as regras não exigem que eu responda à solicitação imediatamente , apenas para faça isso em algum momento .Não tenho certeza se isso funcionará nos Unixes porque usei send em vez de sendall e send não garante realmente enviar tudo o que é alimentado. Funciona no Windows.
fonte
Groovy,
507500489485Adicionado o download da imagem para mostrar que os arquivos binários estão funcionando corretamente - teve alguns problemas com eles, para começar.
Alguém pode sugerir uma maneira mais curta de ler a entrada?
fonte
Erlang (escript) 575
Erlang muito sujo. Tem que haver uma linha em branco no início do arquivo para funcionar bem:
Como executar
Editar:
Eu espremi 20 caracteres.
case
é surpreendentemente mais curto que a função, com um único argumento e três cláusulas.fonte
VB.NET, 7203
Você pode definir qualquer porta e qualquer diretório base usando
--port
e--base
, respectivamente.Não, isso não é realmente uma solução de golfe. Mas, sendo VB.NET, de fato não há sentido. No lado positivo, este possui muitos outros recursos.
Eu até decidi colocá-lo no GitHub :) https://github.com/minitech/DevServ
fonte
For i As Integer = 0 To args.Length - 2
. Se você adicionarStep 2
no final dessa linha, aumentará o contador em dois em vez de em 1.C # (869)
Ungolfed
fonte
Node.js - 636
Apenas testado no Linux, não funciona no Windows.
fonte
Scala, 653 caracteres
Uma captura de tela dele sendo executada no meu MacBook:
Não é ótimo, mas vou tentar esmagá-lo um pouco quando tiver algum tempo depois.
fonte
Python 3-655
fonte
VB.Net (3504 caracteres):
Jogou golfe com a resposta da @ minitech.
fonte
Lua 5.1 em
435434 bytes... e a prova ...
fonte