Ваша задача состоит в том, чтобы написать HTTP-сервер кода-гольфа, который будет принимать запросы GET. Это, очевидно, не должно быть полнофункциональным, но оно должно обслуживать файлы из каталога.
Правила:
- HTTP-сервер должен прослушивать TCP-порт 36895 (0x901F)
- Он должен обслуживать файлы из
/var/www
систем * NIX (например, Linux) илиC:\hgolf
из Windows. - Вы можете игнорировать все входящие заголовки HTTP, кроме самого
GET
себя. - Если метод HTTP не GET, вы должны отправить обратно код состояния «405 Not Supported» и текст «405 Not Supported».
- Если файл не существует, необходимо отправить обратно код состояния «404 Файл не найден» и текст «404 Файл не найден».
- Если файл существует, но не может быть прочитан по какой-либо причине, необходимо отправить обратно код состояния «Ошибка 500 серверов» и текст сообщения «Ошибка 500 серверов».
- Если пользователь запрашивает
/
или любой другой существующий корневой каталог (например, в/foo/
которомfoo
существует каталог/var/www/
), ответьте пустой страницей. - Ваш ответ должен содержать как минимум минимальные заголовки, чтобы содержимое отображалось в Firefox 8.0 и Internet Explorer 8.0
- Вы должны ответить с
Content-Type
набором заголовков, но вам нужно только поддерживать расширенияhtml => text/html
иtxt => text/plain
. Для любого другого расширения файла отправьтеapplication/octet-stream
как тип содержимого. - Ваш код должен иметь возможность передавать как ASCII, так и двоичные данные, хотя вам явно не нужно различать их.
- Вы не можете использовать сторонние библиотеки.
- Вы не можете использовать встроенные классы или функции, предназначенные для обработки HTTP-запросов (например,
HttpListener
в C #) - Если ваш код будет работать только на определенной ОС из-за используемых вами API-интерфейсов сокетов, укажите это.
Решения должны включать изображение, показывающее, как он отображает HTML-страницу в браузере.
Если у вас есть какие-либо вопросы, пожалуйста, не стесняйтесь спрашивать! :)
..
в пути как способ вырваться из определенного корня документа).http
модуль в Node.js ок?Ответы:
Рубин, 383 символа
Перестройка кода для упаковки основной логики в одну строку, что делает код короче. Тем не менее, я надеюсь, что эту версию можно продвинуть немного дальше.
Примечание: я еще не реализовал «500 Server Error», потому что не смог найти подходящую структуру (возможно, упаковываю все в начало / спасение / конец, но чтение файла выполняется после отправки заголовка).
источник
500 Server Error
этого не соответствует требованиям, поэтому не должно быть принято.Bash + netcat: 354 символа
webserver.sh (33 символа):
ш (321 символов):
Образец прогона:
Пример посещения (Firefox 19.0):
источник
nc
сказать, мне говорят, что опция -e не поддерживается. Любые идеи?nc
из BusyBox. Я использую GNUnetcat
.text/plain
?netcat
.)Хаскелл, 636
Файлы передаются в потоковом режиме лениво, поэтому при обслуживании больших файлов не требуется много памяти, но это также означает, что только ошибки в начале передачи (например, ошибки разрешения) приводят к
500 Server Error
.Проверено на Ubuntu 10.10. Может быть портирована на Windows , путем изменения
/var/www
кC:/hgolf
и измененияmain=
кmain=withSocketsDo$
, так как библиотека сокетов на Windows , требует четкого инициализацию.Безголовая версия:
источник
Python 2,
525, 510,493 (в соответствии с правилами 483), символыЯ заявил, что мне нужно только 483 символа, если я нарушаю правила, потому что последний
;c.close()
может быть опущен. Это потому, что как только следующий клиент будет принят, сокет все равно закроется. Это, конечно, несколько увеличит время ожидания (Firefox отобразит страницу только при подключении следующего клиента, Chrome покажет ее раньше, но продолжит загружать), но правила не требуют, чтобы я отвечал на запрос немедленно , только для сделать это в какой-то момент .Я не уверен, будет ли это работать в Unixes, потому что я использовал send вместо sendall, и send не гарантирует фактическую отправку всего, что ему подают. Это работает на Windows.
источник
Groovy,
507500489485Добавлена загрузка изображений, показывающая, что бинарные файлы работают должным образом - было несколько проблем с ними для начала.
Кто-нибудь может предложить более короткий способ прочитать вход?
источник
Эрланг (escript) 575
Очень грязный эрлангский сценарий. В начале файла должна быть одна пустая строка:
Как бегать
Редактировать:
Я выдавил 20 символов.
case
на удивление короче функции с одним аргументом и тремя предложениями.источник
VB.NET, 7203
Вы можете определить любой порт и любой базовый каталог, используя
--port
и--base
, соответственно.Нет, это не совсем решение для игры в гольф. Но, будучи VB.NET, в любом случае нет никакого смысла. На положительной стороне у этого есть намного больше особенностей.
Я даже решил поставить его на GitHub :) https://github.com/minitech/DevServ
источник
For i As Integer = 0 To args.Length - 2
. Если вы добавитеStep 2
в конец этой строки, вы увеличите счетчик на два вместо 1.C # (869)
Ungolfed
источник
Node.js - 636
Только проверено на Linux, не работает на Windows.
источник
Скала, 653 персонажа
Скриншот его работы на моем MacBook:
Не здорово, но я попробую немного раздавить его, когда у меня будет время.
источник
Python 3 - 655
источник
VB.Net (3504 символа):
Гольф от ответа @ minitech.
источник
Lua 5.1 в
435434 байтах... и доказательство ...
источник