KABAFORCEGeliştirici KabaOS'u edinin

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.kbl

Kaynak 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()