Tantangan Anda adalah menulis server HTTP kode-golf yang menerima permintaan GET. Jelas tidak harus berfitur lengkap, tetapi harus melayani file dari direktori.
Aturan:
- Server HTTP harus mendengarkan pada port TCP 36895 (0x901F)
- Itu harus melayani file dari
/var/www
pada * NIX systems (eg Linux), atauC:\hgolf
pada Windows. - Anda dapat mengabaikan semua header HTTP yang masuk kecuali
GET
dirinya sendiri. - Jika metode HTTP tidak DAPATKAN, Anda harus mengirim kembali kode status "405 Tidak Didukung" dan badan "405 Tidak Didukung".
- Jika file tidak ada, Anda harus mengirim kembali kode status "404 File Tidak Ditemukan" dan badan "404 File Tidak Ditemukan".
- Jika file ada tetapi tidak dapat dibaca karena alasan tertentu, Anda harus mengirim kembali kode status "500 Server Error" dan badan "500 Server Error".
- Jika pengguna meminta
/
atau root direktori lain yang ada (misalnya di/foo/
mana direktorifoo
berada/var/www/
), balas dengan halaman kosong. - Respons Anda harus mengandung setidaknya tajuk minimum untuk memungkinkan konten ditampilkan di Firefox 8.0 dan Internet Explorer 8.0
- Anda harus merespons dengan
Content-Type
set tajuk, tetapi Anda hanya perlu mendukung ekstensihtml => text/html
dantxt => text/plain
. Untuk ekstensi file lainnya, Kirimapplication/octet-stream
sebagai jenis konten. - Kode Anda harus dapat mentransfer data ASCII dan biner, meskipun Anda tidak harus secara eksplisit membedakan keduanya.
- Anda tidak boleh menggunakan perpustakaan pihak ke-3.
- Anda tidak boleh menggunakan kelas atau fitur built-in yang dirancang untuk memproses permintaan HTTP (misalnya
HttpListener
dalam C #) - Jika kode Anda hanya akan bekerja pada OS tertentu karena API soket yang Anda gunakan, sebutkan ini.
Solusi harus mencakup gambar yang menunjukkannya melayani halaman HTML ke browser.
Jika Anda memiliki pertanyaan, jangan ragu untuk bertanya! :)
..
di jalan sebagai cara untuk keluar dari root dokumen yang didefinisikan).http
modul di Node.js ok?Jawaban:
Ruby, 383 karakter
Restrukturisasi kode untuk mengemas logika esensial menjadi satu baris yang membuat kode lebih pendek. Meskipun demikian, saya harap versi ini bisa bermain golf sedikit lebih jauh.
Catatan: Saya belum mengimplementasikan "500 Server Error" karena saya tidak dapat menemukan struktur yang sesuai (mungkin mengemas semuanya menjadi awal / penyelamatan / akhir tetapi membaca file dilakukan setelah header dikirim).
sumber
500 Server Error
tidak sesuai dengan persyaratan sehingga tidak boleh diterima.Bash + netcat: 354 karakter
webserver.sh (33 karakter):
w (321 karakter):
Contoh dijalankan:
Kunjungan sampel (Firefox 19.0):
sumber
nc
memberitahu saya bahwa opsi -e tidak didukung. Ada ide?nc
dari BusyBox. Saya menggunakan GNUnetcat
.text/plain
?netcat
.)Haskell, 636
File dialirkan dengan malas, sehingga penyajian file besar tidak menggunakan banyak memori, tetapi ini juga berarti bahwa hanya kesalahan pada awal pengiriman (misalnya kesalahan izin) menghasilkan a
500 Server Error
.Diuji pada Ubuntu 10.10. Dapat porting ke Windows dengan mengubah
/var/www
keC:/hgolf
dan mengubahmain=
kemain=withSocketsDo$
, karena perpustakaan soket pada Windows memerlukan inisialisasi eksplisit.Versi tidak disatukan:
sumber
Python 2,
525 510493 (menekuk aturan 483) karakterSaya menyatakan bahwa saya hanya perlu 483 karakter jika saya membengkokkan aturan karena yang terakhir
;c.close()
bisa dihilangkan. Ini karena saat klien berikutnya diterima, soket tetap ditutup. Ini tentu saja akan menambah waktu tunggu (Firefox hanya akan menampilkan halaman ketika klien berikutnya terhubung, Chrome akan menampilkannya sebelumnya, tetapi akan terus memuat), tetapi aturan tidak mengharuskan saya untuk menanggapi permintaan segera , hanya untuk melakukannya di beberapa titik .Saya tidak yakin apakah ini akan berfungsi pada Unix karena saya menggunakan send bukan sendall dan send tidak menjamin untuk benar-benar mengirim semua yang diumpankan. Itu bekerja pada Windows.
sumber
Groovy,
507500489485Menambahkan unduhan gambar untuk memperlihatkan file-file biner berfungsi dengan baik - memiliki beberapa masalah dengannya.
Adakah yang bisa menyarankan cara yang lebih singkat untuk membaca input?
sumber
Erlang (eskrip) 575
Eskrip Erlang sangat kotor. Harus ada satu baris kosong di awal file agar berfungsi dengan baik:
Bagaimana cara menjalankannya
Edit:
Saya telah memeras 20 karakter.
case
secara mengejutkan lebih pendek dari fungsi bahkan dengan satu argumen dan tiga klausa.sumber
VB.NET, 7203
Anda dapat menentukan port apa saja dan direktori dasar apa saja menggunakan
--port
dan--base
, masing-masing.Tidak, ini bukan solusi golf. Tetapi menjadi VB.NET, sebenarnya tidak ada gunanya. Di sisi positifnya, yang satu ini memiliki lebih banyak fitur.
Saya bahkan memutuskan untuk meletakkannya di GitHub :) https://github.com/minitech/DevServ
sumber
For i As Integer = 0 To args.Length - 2
. Jika Anda menambahkanStep 2
ke akhir baris itu, Anda menambah penghitung dengan dua bukannya 1.C # (869)
Tidak disatukan
sumber
Node.js - 636
Hanya diuji di Linux, tidak akan berfungsi di Windows.
sumber
Scala, 653 karakter
Tangkapan layar yang berjalan di MacBook saya:
Tidak hebat, tapi saya harus sedikit meremasnya ketika saya punya waktu nanti.
sumber
Python 3 - 655
sumber
VB.Net (3504 karakter):
Dikutip dari jawaban minitech.
sumber
Lua 5.1 dalam
435434 byte... dan buktinya ...
sumber