Su desafío es escribir un servidor HTTP de código de golf que acepte solicitudes GET. Obviamente, no tiene que tener todas las funciones, pero debe servir archivos desde un directorio.
Reglas:
- El servidor HTTP debe escuchar en el puerto TCP 36895 (0x901F)
- Debe servir archivos de
/var/www
sistemas * NIX (por ejemplo, Linux) oC:\hgolf
Windows. - Puede ignorar todos los encabezados HTTP entrantes, excepto el
GET
propio. - Si el método HTTP no es GET, debe enviar un código de estado de "405 No admitido" y un cuerpo de "405 No admitido".
- Si el archivo no existe, debe devolver un código de estado de "Archivo 404 no encontrado" y un cuerpo de "Archivo 404 no encontrado".
- Si el archivo existe pero no se pudo leer por alguna razón, debe devolver un código de estado de "Error de servidor 500" y un cuerpo de "Error de servidor 500".
- Si el usuario lo solicita
/
o cualquier otra raíz de directorio existente (por ejemplo,/foo/
dondefoo
existe un directorio/var/www/
), responda con una página en blanco. - Su respuesta debe contener al menos los encabezados mínimos para permitir que el contenido se muestre en Firefox 8.0 e Internet Explorer 8.0
- Debe responder con el
Content-Type
conjunto de encabezado, pero solo debe admitir extensioneshtml => text/html
ytxt => text/plain
. Para cualquier otra extensión de archivo, Enviarapplication/octet-stream
como tipo de contenido. - Su código debe poder transferir tanto datos ASCII como binarios, aunque no tiene que distinguir explícitamente entre los dos.
- No puede usar bibliotecas de terceros.
- No puede usar clases integradas o características diseñadas para procesar solicitudes HTTP (por ejemplo,
HttpListener
en C #) - Si su código solo funcionará en un sistema operativo específico debido a las API de socket que ha utilizado, indíquelo.
Las soluciones deben incluir una imagen que muestre que sirve una página HTML a un navegador.
Si tiene alguna pregunta, no dude en preguntar. :)
..
la ruta como una forma de salir de la raíz del documento definido).http
módulo en Node.js?Respuestas:
Rubí, 383 caracteres.
La reestructuración del código para empaquetar la lógica esencial en una línea que acorta el código. Sin embargo, espero que esta versión se pueda jugar un poco más.
Nota: Todavía no implementé el "Error del servidor 500" porque no pude encontrar una estructura adecuada (quizás empaquetar todo en inicio / rescate / final pero leer el archivo se realiza después de que se envió el encabezado).
fuente
500 Server Error
él no cumple con los requisitos, por lo que no debe ser aceptado.Bash + netcat: 354 caracteres
webserver.sh (33 caracteres):
w (321 caracteres):
Ejecución de muestra:
Visita de muestra (Firefox 19.0):
fuente
nc
me dice que la opción -e no es compatible. ¿Algunas ideas?nc
de BusyBox. Yo uso GNUnetcat
.text/plain
?netcat
)Haskell, 636
Los archivos se transmiten de forma perezosa, por lo que servir archivos grandes no usa mucha memoria, pero esto también significa que solo los errores al comienzo de la transmisión (por ejemplo, errores de permisos) dan como resultado a
500 Server Error
.Probado en Ubuntu 10.10. Se puede portar a Windows cambiando
/var/www
aC:/hgolf
y cambiandomain=
amain=withSocketsDo$
, ya que la biblioteca de sockets en Windows requiere una inicialización explícita.Versión sin golf:
fuente
Python 2,
525 510493 (doblando las reglas 483) caracteresDije que solo necesito 483 caracteres si doblo las reglas porque el último
;c.close()
podría omitirse. Esto se debe a que en el momento en que se acepta el siguiente cliente, el socket se cierra de todos modos. Por supuesto, esto aumentará un poco el tiempo de espera (Firefox solo mostrará la página cuando se conecte el próximo cliente, Chrome la mostrará antes, pero continuará cargándose), pero las reglas no requieren que responda a la solicitud de inmediato , solo para hacerlo en algún momento .No estoy seguro de si esto funcionará en Unixes porque utilicé enviar en lugar de sendall y enviar no garantiza enviar realmente todo lo que se alimenta. Funciona en Windows.
fuente
Groovy,
507500489485Se agregó la descarga de la imagen para mostrar que los archivos binarios funcionan correctamente; para empezar, tuve algunos problemas con ellos.
¿Alguien puede sugerir una forma más corta de leer la entrada?
fuente
Erlang (escript) 575
Muy sucio Erlang escript. Tiene que haber una línea en blanco al comienzo del archivo para que funcione bien:
Como correr
Editar:
He exprimido 20 caracteres.
case
es sorprendentemente más corto que la función con incluso un argumento y tres cláusulas.fuente
VB.NET, 7203
Puede definir cualquier puerto y cualquier directorio base usando
--port
y--base
, respectivamente.No, esto no es realmente una solución de golf. Pero siendo VB.NET, realmente no tiene sentido de todos modos. En el lado positivo, este tiene muchas más características.
Incluso decidí ponerlo en GitHub :) https://github.com/minitech/DevServ
fuente
For i As Integer = 0 To args.Length - 2
. Si agregaStep 2
al final de esa línea, aumenta el contador en dos en lugar de 1.C # (869)
Sin golf
fuente
Node.js - 636
Solo probado en Linux, no funcionará en Windows.
fuente
Scala, 653 caracteres
Una captura de pantalla que se ejecuta en mi MacBook:
No es genial, pero intentaré aplastarlo un poco más tarde.
fuente
Python 3 - 655
fuente
VB.Net (3504 caracteres):
Golfed de la respuesta de @ minitech.
fuente
Lua 5.1 en
435434 bytes... y la prueba ...
fuente