# Core/Http/Engine — istek/yanıt parçaları, doğrulama zinciri ve kural motoru > **Doğrulanan kod tabanı:** `d49b4413` (dal `feat/fw-license-master`) · **Tarih:** 2026-10-05 · **Yayın:** 0.9.7 = bu commit + sonrası; belge yalnız doğrulama anındaki kodu anlatır > **Kaynak klasör:** `Core/Http/Engine/` — **17 `*.php`**. > **Envanter:** 17 dosyanın **17'si** aşağıda anlatıldı (3 kök + `Traits/Request/` 5 + `Traits/Response/` 3 + `Traits/Validator/` 4 + `Traits/Alert/` 2 = 17). ## 1. Ne işe yarar, kim kullanır `Engine/`, `Request`/`Response` sınıflarının **bileşenlerini** barındırır: yüklenen dosya sarmalayıcı (`UploadedFile`), sınıf bazlı doğrulama isteği (`FormRequest`), HTTPS karar merkezi (`RequestEnvironment`) ve beş trait kütüphanesi (istek / yanıt / doğrulayıcı / alert). **Kimler çağırır:** `Core/Http/Request.php` ve `Core/Http/Response.php` bu trait'leri kullanan tek iki sınıftır; controller'lar yalnız `request()` / `response()` yardımcılarıyla erişir. `Packages/RbnFile` doğrudan `UploadedFile` sınıfını örnekler (`FileService.php:45-51`). ## 2. Klasör/dosya envanteri (17/17) ### 2.1 Kök (3) | Dosya | Görev | Önemli public yöntemler | |---|---|---| | `Engine/FormRequest.php` | Sınıf bazlı doğrulama isteği: `authorize()` + `rules()` + `messages()` + kalkan seçenekleri tek sınıfta toplanır. | `authorize(): bool`, `abstract rules(): array`, `messages(): array`, `withShield(): array`, `validateResolved(): array`, `failedAuthorization(): void` | | `Engine/RequestEnvironment.php` | Tek HTTPS karar merkezi; cookie `Secure` bayrağı ve `isSecure()` buradan gelir. `final`, yalnız statik. | `static isHttpsRequest(?array $server = null): bool` | | `Engine/UploadedFile.php` | `$_FILES` girdisini sarmalar; sunucu tarafı üretilen dosyalar `isLocal=true` ile de aynı sınıftan geçer. | `__construct(array $file, bool $isLocal=false)`, `tmpName(): string`, `isValid(): bool`, `isImage(): bool`, `extension(): string`, `mime(): string`, `size(string $unit='MB'): float`, `name(): string`, `move(string $path, ?string $filename=null): bool` | ### 2.2 `Traits/Request/` (5) | Dosya | Görev | Önemli public yöntemler | |---|---|---| | `Traits/Request/InputTrait.php` | Girdi toplama (`GET`+`POST`+`JSON`); `rawInput()` ile korumasız çekirdek. | `all(): array`, `rawInput(array $rules=[]): array`, `input(string,$default=null)`, `query(?string,$default=null)`, `has/filled/missing(string): bool`, `only(array): array`, `except(array): array` | | `Traits/Request/DetectionTrait.php` | Yöntem / içerik tipi / güvenlik algılama. | `method(): string`, `isMethod(string): bool`, `isPost()/isGet(): bool`, `isAjax(): bool`, `wantsJson(): bool`, `wantsXml(): bool`, `isJson(): bool`, `isFormData(): bool`, `prefers(array $contentTypes): ?string`, `isSecure(): bool` | | `Traits/Request/ContextTrait.php` | İstek bağlamı: IP, proje, UA, yol/URL, başlıklar. | `ip(): string`, `projectId(): int`, `userAgent(): string`, `path(): string`, `url(): string`, `fullUrl(): string`, `root(): string`, `bearerToken(): ?string`, `header(string,$default=null)`, `parseHeaders(array): array` | | `Traits/Request/FileTrait.php` | Dosya girdileri. | `file(string): ?UploadedFile`, `hasFile(string): bool`, `allFiles(): array`, `files(string $prefix): array` | | `Traits/Request/ValidationTrait.php` | **Kalkan zinciri**: `shield()`, `validate()`, `form()`, `filter()`, `rawAll()`. | `const FORM_INPUT_MODE_FLAG='security.form_input_mode'`, `const FORM_INPUT_MODE_VARSAYILAN='enforce'`, `const FORM_INPUT_UNVALIDATED_KODU`, `const FORM_INPUT_LOG_ETIKETI`, `shield(array $options=[]): self`, `validate(array $rules,array $messages=[]): array`, `rawAll(array $options=[]): array`, `form(array $rules,array $options=[]): array`, `filter(array $rules,array $options=[]): array`, `formInputMode(): string` (protected) | ### 2.3 `Traits/Response/` (3) | Dosya | Görev | Önemli public yöntemler | |---|---|---| | `Traits/Response/HeaderTrait.php` | Başlıklar, durum kodu, çerez yazımı. | `status(int): self`, `header(string,string): self`, `contentType(string $type='text/html',string $charset='utf-8'): self`, `cookie(string $name,string $value,int $minutes=60,string $path='/',?string $domain=null,?bool $secure=null,bool $httpOnly=true,?string $sameSite='Lax'): self`, `noContent(): void` | | `Traits/Response/ContentTrait.php` | Gövde üretimi (HTML / JSON / alert JSON). | `body(?string): self`, `json(array,int $status=200): void`, `success(mixed $data=[],string $message='OK',int $status=200): void`, `error(string $message,int $status=400,mixed $data=null): void`, `alertJson(array,int $statusCode=200): void` | | `Traits/Response/RedirectTrait.php` | Yönlendirme + **açık yönlendirme (open redirect) süzgeci**. | `redirect(string $url,int $code=302): void`, `redirectExternal(string $url,array $allowedHosts,int $code=303): void` (ödeme/ortak sağlayıcıya geçiş: yalnız çağıranın adıyla verdiği tam host, yalnız https; başka her şey `/`), `guvenliHedef(string $url): string`, `goreliyiMutlakYap(string): string`, `guvenliRedirectHedefi(string): string` (geri uyum), `beyazListeHostlari(): array` | ### 2.4 `Traits/Validator/` (4) | Dosya | Görev | Önemli public yöntemler | |---|---|---| | `Traits/Validator/CoreRulesTrait.php` | Çekirdek kurallar (`required/min/max/…`). | `validateRequired/Min/Max/Numeric/Confirmed/Regex/Alpha/Accepted/Nullable/Optional/String/Array/In/Same(string $field,$value,array $params=[]): void` | | `Traits/Validator/DatabaseRulesTrait.php` | Veritabanı kuralları. | `validateUnique(string,$value,array $params=[]): void`, `validateExists(string,$value,array $params=[]): void` | | `Traits/Validator/NetworkRulesTrait.php` | Ağ/biçim kuralları. | `validateEmail(string,$value): void`, `isDomainSyntaxValid(string): bool`, `validateIp/Url/Date/PhoneTr(string,$value): void` | | `Traits/Validator/HelperTrait.php` | Hata toplama, varsayılan mesaj, alan adı güzelleştirme. | `addError(string $field,string $rule,array $params=[]): void`, `getDefaultMessage(string $rule,string $field,array $params=[]): string`, `getFieldDisplayName(string): string`, `sanitizeInput($input): string` | ### 2.5 `Traits/Alert/` (2) | Dosya | Görev | Önemli public yöntemler | |---|---|---| | `Traits/Alert/NotificationTrait.php` | `alert()->success/error/info/warning()` kısa yolları. | `success/error/info/warning(string $message,?string $redirectUrl=null,?string $message2=null,array $data=[]): self` | | `Traits/Alert/StorageTrait.php` | Mesajın session/cookie'ye yazılması ve temizlenmesi. | `viaCookie(): self`, `viaSession(): self`, `storeAlert(array): void`, `clear(): void` | **Kapsama:** 17/17. ## 3. Akış ### 3.1 Form gönderimi (tarayıcı → DB'ye giden veri) ``` Controller: request()->form($rules, ['csrf' => true]) └─ ValidationTrait::form() ValidationTrait.php:125 ├─ applyFormGuard($options) :274 │ ├─ isMethod($options['method'] ?? 'POST') değilse alert()->error + exit │ └─ shield($options) (bayrak + seçenek) ├─ formInputMode() → Config::get('security.form_input_mode', 'enforce') :175-192 ├─ enforce kipi + boş kural dizisi → InvalidArgumentException :131-138 ├─ validate($rules) :140 │ ├─ shieldActive → applyShieldConfigurations() :288 │ │ └─ FormService::runSecurityChecks($_POST, opts) → ../Security/README.md │ ├─ POST_MAX_SIZE kontrolü (post boş + CONTENT_LENGTH>2048) :56-61 │ ├─ Validator::make(all(), $rules) :64 │ │ ├─ applyRule() → validateX() eşleşmesi Validator.php:104-127 │ │ └─ bilinmeyen kural: kayıt + error_log, DEVAM :143-150 │ ├─ fails() → handleFailedValidation(): $_SESSION['_errors']['_old_input'] + alert()->error + exit :318-330 │ └─ afterValidate() kancası (varsa) :73-78 ├─ enforce → yalnız $validated │ log/off → array_merge(rawInput($rules), $validated); log'da düşen alan adları kaydedilir :142-151 └─ nullable/optional alanlarda "" → null :155-162 ``` ### 3.2 Yanıt ve yönlendirme ``` Controller: redirect('/panel') → Response::redirect() RedirectTrait.php:43 ├─ guvenliHedef($url) :45 / :85 │ 1) boş → '/' :90-92 │ 2) kontrol karakteri/CRLF → '/' :95-97 │ 3) '\' → '/' :105 │ 4) başı '/' olmayan GÖRELİ yol → '/' eklenir (şema taşıyan dokunulmaz) :118 / :182-197 │ 5) '//host' veya mutlak → beyaz listede mi? :123-158 │ 6) değilse → '/' (fail-closed) :161 ├─ headers_sent() değilse http_response_code + header('Location') └─ headers gittiyse