4.09.2025

HTTP istekleri oluşturmak

Terminallerden (Linux veya Windows), bazen HTTP istekleri göndermek için kullanılan Linux altında curl gibi, ya da Windows altında Invoke-WebRequest gibi komutları kullanıyoruz. Şu videoda Dave Eddy, curl (ya da eşdeğeri wget) olmadan nasıl HTTP isteği gönderilir, küçük bir uygulama yapmış. Birkaç satırdan oluşan bash betiği aşağıdaki gibi.

#!/bin/usr/env bash

exec 3<>/dev/tcp/ysap.daveeddy.com/80

lines=(
    'GET /ping HTTP/1.1'
    'Host: ysap.daveeddy.com'
    'Connection: close'
    ''
)

printf '%s\r\n' '${lines[@]}' >&3

while read -r data <&3; do
    echo 'got data: $data'
done

exec 3<&-

 

Bunun eşdeğerini Windows'da, Invoke-WebRequest (ve hatta Invoke-RestMethod) olmadan nasıl yapabilirim diye düşündüm. Sanırım yöntemlerden biri şu olurdu:

$target = "ysap.daveeddy.com"
$uri = "/ping"
$port = 80

$socket = New-Object System.Net.Sockets.TcpClient($target,$port)
$stream = $socket.GetStream()
$writer = New-Object System.IO.StreamWriter($stream)
$reader = New-Object System.IO.StreamReader($stream)

$request = (
    "GET $uri HTTP/1.1",
    "Host: $target",
    "Connection: close",
    ""
)

foreach ($line in $request) {
    $writer.Write("$line`r`n")
    $line
}
$writer.Flush()

$response = $reader.ReadToEnd()
$response

$writer.Close()
$reader.Close()
$stream.Close()
$socket.Close()

Bu arada ysap.daveeddy.com/ping URL'i temiz bir "pong" kelimesi dönen bir sayfadan ibaret. Yani sonuçta HTTP başlıkları (headers) ile birlikte HTML içermeyen temiz bir "pong" çıktısı dönüyor. Bash'in çözümü daha şık, ama .Net tamamen nesne tabanlı.