Rust LogoURL Shortener

Bir URL kısaltıcı, uzun ve karmaşık bir İnternet adresini (URL) daha kısa, daha yönetilebilir bir adrese dönüştüren bir web hizmetidir. Bu kısaltılmış URL'ler genellikle sosyal medya gönderileri, e-postalar veya basılı materyaller gibi karakter sınırlaması olan yerlerde paylaşımı kolaylaştırmak, okunabilirliği artırmak veya orijinal URL'yi gizlemek için kullanılır.

Nasıl Çalışır?
1. Giriş: Kullanıcı, kısaltmak istediği uzun URL'yi URL kısaltıcı hizmetine sunar.
2. Kısa Kod Üretimi: Hizmet, o uzun URL için benzersiz, kısa bir alfanümerik kod (örneğin, "XYZ1A2") oluşturur. Bu kod genellikle rasgele karakterler, bir sayacın Base62 veya Base36 ile kodlanması ya da bir hash fonksiyonunun çıktısı kullanılarak üretilir. Üretilen kodun benzersiz olması sağlanır.
3. Depolama: Kısaltıcı hizmeti, bu kısa kod ile orijinal uzun URL arasındaki eşleşmeyi bir veritabanında (veya bellekte) saklar.
4. Kısaltılmış URL Oluşturma: Kısaltıcı hizmeti, kendi etki alanını (örneğin, `http://bit.ly/`) oluşturulan kısa kodla birleştirerek kısaltılmış URL'yi (örneğin, `http://bit.ly/XYZ1A2`) oluşturur ve kullanıcıya sunar.
5. Yönlendirme (Redirection): Bir kullanıcı kısaltılmış URL'ye eriştiğinde (tarayıcıya girdiğinde veya bağlantıya tıkladığında), kısaltıcı hizmeti kısa kodu veritabanında arar. Eşleşen orijinal uzun URL bulunduğunda, hizmet kullanıcının tarayıcısını HTTP 301 (Kalıcı Yönlendirme) veya 302 (Geçici Yönlendirme) durum koduyla orijinal uzun URL'ye yönlendirir. Tarayıcı daha sonra orijinal hedefe gider.

Temel Özellikler ve Faydaları:
* Okunabilirlik ve Paylaşım Kolaylığı: Uzun URL'leri kısaltarak daha estetik ve paylaşılabilir hale getirir.
* Karakter Sınırlamaları: Twitter gibi platformlarda veya SMS mesajlarında değerli karakter alanından tasarruf sağlar.
* Analitik ve Takip: Birçok URL kısaltıcı hizmeti, kısaltılmış bağlantılara kaç kez tıklandığı, tıklamaların coğrafi konumu gibi temel analitik verileri sağlar.
* Özel URL'ler: Bazı hizmetler, kullanıcıların kısa kodu kendi tercih ettikleri kelimelerle özelleştirmelerine olanak tanır.
* Güvenlik: Kötü niyetli URL'leri tarama ve engelleme yeteneğine sahip olabilirler.

Önemli Hususlar:
* Kırık Linkler: Kısaltıcı hizmeti kapanırsa veya veritabanını kaybederse, kısaltılmış tüm linkler çalışmayı durdurur.
* Güvenlik Riskleri: Kullanıcılar kısaltılmış bir linkin arkasında ne olduğunu bilmedikleri için kimlik avı (phishing) veya kötü amaçlı yazılım içeren sitelere yönlendirilebilirler. Bazı hizmetler bu tür riskleri azaltmak için önizleme veya tarama seçenekleri sunar.

Örnek kod, bu temel mekaniği Rust programlama dilinde bellekte saklanan bir yapı ile basitçe simüle etmektedir.

Example Code

```rust
use std::collections::HashMap;
use rand::{thread_rng, Rng};

/// Basit bir URL kısaltıcı servisi için yapı.
/// URL eşleştirmelerini bellekte (HashMap) saklar.
pub struct UrlShortener {
    mappings: HashMap<String, String>, // kısa_kod -> uzun_url
}

impl UrlShortener {
    /// Yeni bir UrlShortener örneği oluşturur.
    pub fn new() -> Self {
        UrlShortener {
            mappings: HashMap::new(),
        }
    }

    /// Benzersiz, rastgele bir kısa kod üretir.
    /// Çakışmaları önlemek için `shorten_url` içinde kontrol edilir.
    fn generate_short_code(&self) -> String {
        const CHARSET: &[u8] = b"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
        const SHORT_CODE_LENGTH: usize = 6;

        let mut rng = thread_rng();
        (0..SHORT_CODE_LENGTH)
            .map(|_|
                {
                    let idx = rng.gen_range(0..CHARSET.len());
                    CHARSET[idx] as char
                })
            .collect()
    }

    /// Verilen uzun URL'yi kısaltır ve benzersiz bir kısa kod döndürür.
    /// Eğer aynı URL birden fazla kısaltılırsa, her seferinde yeni bir kısa kod üretir.
    /// Gerçek bir serviste, aynı URL için önceden kısaltılmış bir kod varsa onu döndürmek tercih edilebilir.
    pub fn shorten_url(&mut self, long_url: String) -> String {
        let mut short_code = self.generate_short_code();

        // Üretilen kısa kodun zaten kullanımda olup olmadığını kontrol et ve benzersiz olana kadar yeni kod üret.
        while self.mappings.contains_key(&short_code) {
            short_code = self.generate_short_code();
        }

        // Eşleşmeyi sakla.
        self.mappings.insert(short_code.clone(), long_url);
        short_code
    }

    /// Verilen kısa kod için orijinal uzun URL'yi alır.
    /// Eğer kısa kod bulunamazsa `None` döndürür.
    pub fn retrieve_long_url(&self, short_code: &str) -> Option<String> {
        self.mappings.get(short_code).cloned()
    }
}

fn main() {
    // Yeni bir URL kısaltıcı örneği oluştur.
    let mut shortener = UrlShortener::new();

    // Kısaltılacak bazı örnek URL'ler.
    let url1 = "https://www.google.com/search?q=rust+programming+language&oq=rust+programming+language&aqs=chrome..69i57j0l7.5303j0j7&sourceid=chrome&ie=UTF-8".to_string();
    let url2 = "https://doc.rust-lang.org/book/title-page.html".to_string();
    let url3 = "https://crates.io/".to_string();

    println!("Orijinal URL 1: {}", url1);
    let short_code1 = shortener.shorten_url(url1);
    println!("Kısaltılmış URL 1: http://my.short/{}\n", short_code1);

    println!("Orijinal URL 2: {}", url2);
    let short_code2 = shortener.shorten_url(url2);
    println!("Kısaltılmış URL 2: http://my.short/{}\n", short_code2);

    println!("Orijinal URL 3: {}", url3);
    let short_code3 = shortener.shorten_url(url3);
    println!("Kısaltılmış URL 3: http://my.short/{}\n", short_code3);

    println!("--- URL'leri Geri Alma ---");

    // Kısaltılmış kodları kullanarak orijinal URL'leri geri al.
    if let Some(long_url) = shortener.retrieve_long_url(&short_code1) {
        println!("Kısa kod {} için alınan URL: {}", short_code1, long_url);
    } else {
        println!("Kısa kod {} için URL bulunamadı.", short_code1);
    }

    if let Some(long_url) = shortener.retrieve_long_url(&short_code2) {
        println!("Kısa kod {} için alınan URL: {}", short_code2, long_url);
    } else {
        println!("Kısa kod {} için URL bulunamadı.", short_code2);
    }

    // Geçersiz bir kısa kod ile deneme.
    let invalid_code = "invalid_code";
    if let Some(long_url) = shortener.retrieve_long_url(invalid_code) {
        println!("Kısa kod {} için alınan URL: {}", invalid_code, long_url);
    } else {
        println!("Kısa kod {} için URL bulunamadı.", invalid_code);
    }
}
```

`Cargo.toml` dosyasına eklemeniz gereken bağımlılık:
```toml
[dependencies]
rand = "0.8"
```