Web · 58 satır
Web sunucusu
Yol eşleme (/kisi/{ad}), sorgu dizgesi, POST gövdesi, JSON/HTML yanıt ve web.kacir ile XSS koruması.
Önizleme · 0.6.0 — dil 1.0 öncesidir; sözdizimi ve kütüphane değişebilir. Buradaki her örnek derlenerek sınanır.
Çalıştırın
Uçbirim
kabalang calistir 01_web_sunucusu.kblKaynak kod
01_web_sunucusu.kbl
# KabaLang ile web uygulaması — ek kütüphane gerektirmeyen HTTP sunucusu (kaba.web)
#
# Çalıştır: kabalang calistir ornekler/05-web/01_web_sunucusu.kbl
# Dene: curl http://127.0.0.1:8080/
# curl "http://127.0.0.1:8080/kisi/ayse"
# curl "http://127.0.0.1:8080/ara?q=deniz+mavi"
# curl -X POST --data "merhaba" http://127.0.0.1:8080/yukle
#
# ⚠️ Sunucu VARSAYILAN OLARAK yalnız 127.0.0.1'i dinler. Ağa açmak açık bir
# karardır: web.sunucu(8080, "0.0.0.0")
# ⚠️ İşleyiciler aynı anda birden çok iş parçacığında koşar; paylaşılan bir
# değişkeni yazmak yarış koşuludur. Tek iş parçacığı isterseniz:
# web.sunucu(8080, "127.0.0.1", 1)
kullan kaba.web
fonksiyon ana_sayfa(_istek):
govde = "<h1>Merhaba KabaOS</h1>"
govde = govde + "<p>KabaLang ile yazılmış web sunucusu.</p>"
govde = govde + "<ul>"
govde = govde + "<li><a href='/kisi/ayse'>/kisi/{ad}</a></li>"
govde = govde + "<li><a href='/ara?q=deniz'>/ara?q=...</a></li>"
govde = govde + "</ul>"
don web.html(govde)
fonksiyon selamla(istek):
# Yol parametresi: /kisi/{ad}
don web.yanit("Merhaba " + istek.parametre("ad"))
fonksiyon arama(istek):
# ⚠️ Kullanıcı verisi HTML'e girerken KAÇIRILIR (web.kacir).
# Kaçırılmazsa `?q=<script>` yansımalı XSS olurdu.
aranan = web.kacir(istek.sorgu("q"))
don web.html("<p>Aranan: " + aranan + "</p>")
fonksiyon yukleme(istek):
don web.json("{\"alinan_bayt\": " + metin(istek.govde_boyutu()) + "}")
sunucu = web.sunucu(8080)
sunucu.al("/", ana_sayfa)
sunucu.al("/kisi/{ad}", selamla)
sunucu.al("/ara", arama)
sunucu.gonder("/yukle", yukleme)
# ⚠️ İşleyici, KENDİSİNDEN ÖNCE tanımlanmış değişkenleri görür. `sunucu`
# aşağıda tanımlandığı için bir işleyicinin içinden `sunucu.istek_sayisi()`
# çağrılamaz (ÖLÇÜLDÜ: "'sunucu' adında bir değişken tanımlanmamış").
# Sayaç gerekiyorsa işleyici dışında okuyun.
# Tek satırlık işleyici de olur:
sunucu.al("/saglik",(istek) => web.yanit("tamam"))
# Statik dosya sunumu (yol geçişine karşı kapalı, gizli dosyalar sunulmaz):
# sunucu.dizin("/statik", "/var/www")
yazdir("Sunucu hazırlanıyor...")
sunucu.basla()