İçeriğe geç
LexerLangv0.1.0

İstek ve yanıt

http_request, form ve JSON gövdeleri, başlıklar, çerezler ve yalıtım.

$app.listen dinlemeye başladığında sayfa artık bir kez değil, her istekte yeniden çalışır:

Metin
istek
  ↓
dosya baştan yürütülür   (AST cache'ten; dosya değiştiyse yeniden ayrıştırılır)
  ↓
$req = new http_request  → o isteğin nesnesi
  ↓
belge kurulur
  ↓
SSR → minify → gzip → yanıt
LexerLang
use http_request

$req = new http_request

if $req.method == http_request.types.POST then
    out($req.form_data.name)
end if

Okunabilenler#

ÇağrıDöner
$req.method"GET" / "POST" / …
$req.pathistek yolu
$req.content_type"application/json" gibi (parametreler ayıklanmış)
$req.form_dataform alanları nesnesi
$req.jsonçözülmüş JSON gövdesi ya da null
$req.datagövde biçimine bakmadan POST verisi
$req.querysorgu parametreleri nesnesi
$req.headersbaşlıklar nesnesi (adlar küçük harf)
$req.bodyham gövde
$req.form("ad")alan ya da null
$req.get("q")sorgu parametresi ya da null
$req.header("accept")başlık ya da null
$req.is("POST")büyük/küçük harf duyarsız karşılaştırma

http_request.types tablosu: GET POST PUT DELETE PATCH HEAD OPTIONS.

Nesne mi yardımcı mı#

$req.form_data.name alan yoksa hata verir — yazım hatası sessizce geçmesin diye. İsteğe bağlı alanlar için $req.form("name") kullanın; yoksa null döner.

Gövde biçimleri#

Content-TypeNereye düşer
application/x-www-form-urlencodedform_data ve data
multipart/form-dataform_data ve data (metin alanları)
application/jsonjson ve data

; charset=utf-8 gibi parametreler yok sayılır. Bozuk JSON sayfayı çökertmez; json null olur.

JSON, dilin kendi değerlerine çevrilir: nesne → object, dizi → array, sayı → int/float, true/falsebool, nullnull.

LexerLang
$j = $req.json
out($j.get("kullanici").get("ad"))
out($j.get("etiketler").get(0))

Kaçışlama#

Form verisi ham HTML değildir; belgeye girerken kaçışlanır. name=<script> göndermek etiket açmaz.

Yalıtım#

Her istek kendi çalıştırmasında yaşar; bir isteğin değişkenleri diğerine sızmaz. Eş zamanlı istekler birbirini etkilemez. from_file ile dahil edilen sayfalar da o anki isteği görür.

new http_request istek bağlamı yokken boş bir GET isteği döndürür; böylece sayfa konsoldan da çalıştırılabilir.

Kabul edilen yöntemler dinamik modda GET HEAD POST PUT DELETE PATCH, statik modda yalnızca GET HEAD'dir.

Dosya yükleme#

HTML
<form method="POST" enctype="multipart/form-data">
    <input type="file" name="belge">
</form>
LexerLang
$file = $req.files("belge")

if $file != null then
    $file.save(path.pwd + "/uploads/" + $file.uuid + "." + $file.extension)
end if
Alan / çağrıAnlamı
$file.namegönderilen ad — yol kısmı temizlenmiştir
$file.safe_namediske yazmaya uygun ad
$file.uuidher yükleme için benzersiz tanımlayıcı
$file.sizebayt
$file.mime_typetür — içerikten belirlenir
$file.extensionuzantı (noktasız)
$file.imagegörüntüyse {type, width, height}, değilse null
$file.contentikili içerik
$file.save($yol)diske yazar; dizin yoksa oluşturur

Diske yazarken gönderilen adı kullanmayın. uuid iki kullanıcının aynı adı göndermesinde dosyaların birbirini ezmesini de engeller. Orijinal ad $file.name olarak durur ve meta veri diye saklanabilir.

Tür istemcinin bildirdiği başlıktan değil içerikten okunur; bildirilen başlık kullanıcıdan gelir ve değiştirilebilir. Gönderilen ad güvenilmezdir (../../etc/passwd); yalnızca son parça alınır. Gövde sınırı 10 MB'dir.

Görüntü işleme#

LexerLang
$gorsel = fs.image($file.content)
$gorsel.resize({width: 800}).to_jpeg({quality: 80}).save($yol)

Okunan ve yazılan biçimler: JPEG, PNG, GIF. to_webp(...) henüz yok.

Sırada#

Dış servis çağrısı.