Başlıkla ilgili kendime kısa notlar alıp hemen gidiyorum. İlgili bir iki üç link bırakıyorum ki konuyu arşivleyelim. Konunun özeti ise şu şekilde: “GET Requestleri özelleştirerek Response’a müdahale ediyoruz. Diğer bir ifade ile Client’ın isteklerine göre Response’u manipüle ediyoruz” O halde direk basit bir örnek ile ne anlatmak istediğimizi somutlaştıralım.
Örneği hızlandırmak için Vagrant ile bir VM kuralım ve Apache servisi ile dosyalarımızı kolay yönelim. Süreç bittiğinde de kolay bir şekilde VM'i geri kaldıralım. Vagrantfile için basit ayarlar şu şekilde:
Vagrant.configure("2") do |config|
config.vm.box = "ubuntu/bionic64"
config.vm.network "private_network", ip: "192.168.63.10"
config.vm.network "public_network"
config.vm.provider "virtualbox" do |vb|
vb.memory = "1024"
end
end
Ayağa kaldıralım:
$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Importing base box 'ubuntu/bionic64'...
==> default: Matching MAC address for NAT networking...
==> default: Checking if box 'ubuntu/bionic64' version '20220726.0.0' is up to date...
...
...
SSH bağlantısı kuralım ve gerekli araçları yükleyelim:
$ vagrant ssh
Welcome to Ubuntu 18.04.6 LTS (GNU/Linux 4.15.0-189-generic x86_64)
...
...
$ sudo -i
$ apt update
$ apt upgrade -y
$ apt install apache2 -y
$ systemctl start apache2
$ systemctl enable apache2
$ systemctl status apache2
● apache2.service - The Apache HTTP Server
Loaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor preset:
Drop-In: /lib/systemd/system/apache2.service.d
└─apache2-systemd.conf
Active: active (running) since Mon 2022-08-22 12:55:06 UTC; 1min 7s ago
Main PID: 9250 (apache2)
Tasks: 55 (limit: 1151)
Apache servisini ayağa kaldırdık. GET Request'i ile kontrol edelim:
$ ifconfig
...
...
enp0s8: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.63.10 netmask 255.255.255.0 broadcast 192.168.63.255
inet6 fe80::a00:27ff:fe99:3985 prefixlen 64 scopeid 0x20<link>
ether 08:00:27:99:39:85 txqueuelen 1000 (Ethernet)
RX packets 19 bytes 1634 (1.6 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 12 bytes 936 (936.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
...
...
$ curl -I 192.168.63.10
HTTP/1.1 200 OK
Date: Mon, 22 Aug 2022 13:01:24 GMT
Server: Apache/2.4.29 (Ubuntu)
...
...
Response için 200 OK döndüğüne göre herhangi bir sıkıntı yok. İlk olarak Partial GET Request'i atalım. Request atabileceğimiz basit bir content oluşturalım.
$ rm /var/www/html/index.html
$ cd /var/www/html && seq 30 > seq.txt
$ cat seq.txt
1
2
3
.
.
.
29
30
1-30 arasi contente sahip bir .txt dosyası oluşturduk. Yine bir GET Requesti ile kontrol edelim:
$ curl 192.168.63.10/seq.txt
1
2
3
4
.
.
.
29
30
$ curl -I 192.168.63.10/seq.txt
HTTP/1.1 200 OK
Date: Mon, 22 Aug 2022 13:09:26 GMT
Server: Apache/2.4.29 (Ubuntu)
Last-Modified: Mon, 22 Aug 2022 13:07:39 GMT
ETag: "51-5e6d421e59efb"
Accept-Ranges: bytes
Content-Length: 81
Vary: Accept-Encoding
Content-Type: text/plain
Herhangi bir sıkıntı olmadığına göre. İsteklerimize göre GET Requesti atalım ve Response'u manipüle edelim. Elimizdeki contente baktımığımız zaman 1'den 30'a kadar sayılar var. Client'ın 1 ile 7 arasındaki sayıları istediğini varsayalım. Bunun için Response için dönen Header'dan kopya çekebiliriz. Öncellikle kabul edilen Accept-Ranges tipinin byte olduğunu görüyoruz. Bundan dolayı Request için Header'a bir byte tipinde range ekleyeceğiz. Content-Length 81 olduğuna göre bu aralıkta bir sınır belirleyebiliriz. Örneğin:
$ curl --header "Range: bytes=0-10" 192.168.6310/seq.txt
1
2
3
4
5
6
$ curl --header "Range: bytes=11-22" 192.168.63.10/seq.txt
7
8
9
10
Belirttiğimiz Request Header'ı ile Response'u manipüle etmiş olduk. Farklı yaklaşımlar için yukarıda bırakmış olduğum linkleri inceleyebilirsiniz. Fakat mantığı temel düzeyde bu şekilde.
Bu sadelik ile devam ederek şimdi de Conditional Request'e göz atalım. Anlaşılacağı üzere koşula bağlı requestler atıyoruz. Yukarı çalıştırdığımız komutu tekrar çalıştırarak Response Header'ını tekrardan inceleyelim.
$ curl -I 192.168.63.10/seq.txt
HTTP/1.1 200 OK
Date: Mon, 22 Aug 2022 13:29:44 GMT
Server: Apache/2.4.29 (Ubuntu)
Last-Modified: Mon, 22 Aug 2022 13:07:39 GMT
...
...
Last-Modified kısmı ile işimiz var. Son düzeltmenin tarihi hakkında bize bilgi veriyor. Şimdi Client'ın belirli bir tarihten sonra düzeltilmiş olan içeriklere ulaşmak istediği senaryosunu düşünelim. O halde GET Request için:
$ curl -I --header "If-Modified-Since: Mon, 22 Aug 2022 13:07:39 GMT" 192.168.63.10/seq.txt
HTTP/1.1 304 Not Modified
Date: Mon, 22 Aug 2022 13:33:41 GMT
Server: Apache/2.4.29 (Ubuntu)
ETag: "51-5e6d421e59efb"
$ curl -I --header "If-Modified-Since: Mon, 22 Aug 2022 13:07:38 GMT" 192.168.63.10/seq.txt
HTTP/1.1 200 OK
Date: Mon, 22 Aug 2022 13:34:28 GMT
Server: Apache/2.4.29 (Ubuntu)
Last-Modified: Mon, 22 Aug 2022 13:07:39 GMT
...
...
İki farklı GET Request'te bulunduk. İlkinde Request için Header alanına eklemiş olduğumuz "If-Modified-Since" için yukarıdaki Response Header'ında dönen Last-Modified değeri ile aynı değeri belirledik. Dönen Response için Header'a baktığımız zaman 304 Not Modified statüsünü aldık. Yani belirttiğimiz tarihten itibaren herhangi bir değişiklik bulunmamakta. İkinci GET Request'te ise Header için verdiğimiz değeri sadece bir saniye geriye alarak 200 OK statüsü almış olduk. Basitçe Conditional Request'i de bu şekilde ele alabiliriz. Tekradan yukarıda bırakmış olduğum linkler ile daha temiz bir açıklama görebilirsiniz. Şimdilik bu kadar.
Kurmuş olduğumuz VM'i kaldırmak için:
$ logout
$ vagrant destroy
default: Are you sure you want to destroy the 'default' VM? [y/N] y
==> default: Forcing shutdown of VM...
==> default: Destroying VM and associated drives...
İletişime geçmek, yorum bırakmak veya hatalarımı düzetlmek istersen mail atabilirsin.