Uzun uğraşımı aldığı için şoyle bir blogpost ihtiyacı hissetim. Appserv’in aşağıdaki sürümlerinden birini indirdiğinizi varsayıyoruz.

Appserv 2.5.10

http://prdownloads.sourceforge.net/appserv/appserv-win32-2.5.10.exe?download

Appserv 2.6.0

http://prdownloads.sourceforge.net/appserv/appserv-win32-2.6.0.exe?download

  • Appserv kurulumunu bitirin. (C:\Appserv klasörüne kurduğunuzu farzediyoruz.)
  • C:\Appserv\Apache2.2\bin  klasoru içindeki ssleay32.dll ve libeay32.dll dosyalarını C:\Windows\system32  klasorunun içine kopyalıyoruz.
  • http://www.thompsonbd.com/files/apache/openssl.cnf buradan  openssl.cnf dosyasını indirin ve c:\Appserv\Apache2.2\bin  klasorunun içine kopyalayın.
  • Şimdi Sertifikayı dos ekranından sertifikayı oluşturacağız.
    0
    
    cd C:\AppServ\Apache2.2\bin

    #komutuyla buraya konumlanın ve şı komutu çalıştırın:

    0
    
    openssl  req  -config  openssl.cnf  -new  -out  server.csr

    sizden “pass phrase” girmenizi isteyecek bir şifre belirleyin bunu key oluştururken kullanacaksınız. çıktı yaklaşık şoyle olur.

    0
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    
    Loading ’screen’ into random state – done
    Generating a 1024 bit RSA private key
    ………….++++++
    ……………………++++++
    writing new private key to ‘privkey.pem’
    Enter PEM pass phrase: 12345
    Verifying – Enter PEM pass phrase:12345
    —–
    You are about to be asked to enter information that will be incorporated
    into your certificate request.
    What you are about to enter is what is called a Distinguished Name or a DN.
    There are quite a few fields but you can leave some blank
    For some fields there will be a default value,
    If you enter ‘., the field will be left blank.
    —–
    Country Name (2 letter code) []:TR
    State or Province Name (full name) []:Cebeci
    Locality Name (eg, city) []:Ankara
    Organization Name (eg, company) []:HomeOffice
    Organizational Unit Name (eg, section) []:Software Development
    Common Name (eg, your websites domain name) []:localhost
    Email Address []:mail@localmail.com
    Please enter the following ‘extra’ attributes
    to be sent with your certificate request
    A challenge password []:12345
  • bitirince aşağıdaki komutu kullanıp diğer detayları doldurun (pass phrase burada istenecek):
    0
    
    openssl  rsa  -in privkey.pem  -out  server.key

    şöyle bir çıktı alırısınız

    0
    1
    
    Enter pass phrase for privkey.pem:
    writing RSA key
  • Şimdi public key oluşturma zamanı:
    openssl  x509 -in  server.csr  -out  server.cert  -req  -signkey  server.key  -days  365
    yine çıktı şuna benzeyecektir:

    0
    1
    2
    3
    4
    5
    6
    7
    
    -signkey  server.key  -days  365
     
    Loading ’screen’ into random state – done
     
    Signature ok
    subject=/C=TR/ST=Cebeci/L=Ankara/O=HomeOffice/OU=Software Development/CN=localhost/emailAddress=mail@localmail.com
    mail@localmail.com
    Getting Private key
  • 0
    
    openssl  x509 -in  server.cert  -out  server.der.crt    -outform DER

    bu komutu da çalıştırın ve şu çıktıyı alın -outform DER sonra da kına yakın olur mu.

  • C:/appserv/Apache2.2/conf/ssl bu klasörü oluşturun server.key ve server.cert dosyalarını buraya taşıyın. (C:\Appserv\Apache2.2\bin klasöründe oluştular)
  • C:\Appserv\Apache2.2\conf\httpd.conf dosyasında n LoadModule ssl_modulemodules/mod_ssl.so satırını bulup başındaki # işaretini kaldırın.
  • Aynı dosyada Listen 80 satırını bulup hemen altında Listen 443 satırını ekleyin.
  • Ve bunu da virtualhost bloku gördüğünüz yere ya da en alta yapıştırın
    0
    1
    2
    3
    4
    
      <VirtualHost localhost:443>
       SSLEngine On
       SSLCertificateFile conf/ssl/server.cert
       SSLCertificateKeyFile conf/ssl/server.key
     &lt;/VirtualHost>
  • ssl.conf dosyasını bu adresten indirip http://www.thompsonbd.com/files/apache/ssl.conf  C:\AppServ\Apache2.2\conf klasörüne kopyalayın
  • Artık apacheyi yeniden başlatıp https://localhost  deneyebilirsiniz.

Bu yazımda Accept: headerların hepsini işlemek istiyorum tek başına anlatılacaklar var arada ama yine de ben yazayım.

Accept

Accept:text/plain,text/html

Accept: başlığında client tarafından kabul edilen içerik (mime type) belirtilir. Sunucu bunları dikkate alıp içeriği bunlara göre ayarlayabilmeli. Image gösteremeyecek bir browser image/jpeg image/png göndermez. biz de buna image cıktısı vermeyecek bir içerik hazırlarız.

Accept-Charset

Accept-Charset:utf-8,iso-8859-9

Accept Charset adından da anlaşılacağı gibi kabul ettiği ,desteklediği karaktersetleri belirten bir client başlığıdır. bu belirteçler ilk karşılaşmada gereksiz görülebilir ama sakın öyle düşünmeyin. biz herşeyi oldu bitti görünce bunlar olmasa da olur sanıyoruz ama bunları bize sunabilmeleri için böyle şahane bir protkol geliştirmişler ve Http 1.1 ile gelen bazı başlıklar httpyi daha da kullanışlı hale getirmiştir.

bugünlerde yazmakta olduğum tts (Text to Speech) server için bir protokol geliştirmeyi düşündük. ilkel yontemlerle ilk once stringi alıp sonra uzunluğu bildirip ardından da içeriği gondermekti ilk işlem. ama bu işlem gittikçe profesyonelleşme isteğiyle beraber karmaşıklığı da getirdi. tts engine da seçilebilmeliydi.. bir takım ayarlamalar client tarafından gelen istekle değiştirilebilmeliydi. bunların hepsi için bir bir değişiklik yapmak sıkıcı olmalıydı ki benim de en cok sevdiğim prokol http imdadımıza yetişti (: ilk once .nette HttpServer sınfımı yazdım header biriktiren metoda gore QueryString parcalayan vs.vs. sonra da tek işim header bilgisinden bana lazım olanları alıp cıkıtyı üretmek. ne kadar kolay değil mi (: rahatlığı kendinize her zaman kazandırmak için rahatınızdan biran ödün verin. bunun çok ama çok faydasını gördüm.

Accept-Encoding

Accept-Encoding:deflate,gzip,zip,rar,7zip

Önceki yazılarımda Encoding başlığını anlatmışım fakat sürüsünden ayrılmasın istedim ve buraya da yazıyorum. Client tarafında çözülebilecek encodingleri servera bildiren bu başlık alacağımız içerik türünün çeşitliliğini de belirler. Örn: aspx output compression yazımda ilk terciğim deflate ikincisi gzip ti defalte varse deflate içeriğini gönderiyordum yoksa gzip. bu da demek oluyorki client ikisini de açabilmeli benim de ona cevabım Content-Encoding başlığında yazıyordu sıkıştırdığım metodu bilmeyen client deneme yanılma yapamaz sanırım (:

Accept-Language

Accept-Language: tr

benim hiç bi sunucuda ya da sitemde kullanmdığım bir başlık (kısmet olmadı) .birden fazla dile cevap verebilecek bir sunucunuz varsa bunu dikkate alarak kullanıcıya göre dilimizi değiştirebiliriz.
No: Client Dile göre işlem yapmayacağından (en azından tarayıcılar) bunun client tarafına bildirilmesine gerek yoktur.

Accept-Ranges

Accept-Ranges:5000

bu başlık cok nadir clientlar tarafından yapılan HEAD isteğinden sonra dikkate alınır. client tarafından gelen Range:bytes=100-500 gibi bir başlık sunucuya hangi alanları godnereceğini belirtir . fakat istekten once HEAD alınmamışsa sunucu kafasına göre davranabilir. Range Desteklenmiyorusa Accept-Ranges:none başlığı gonderilebilir.

Accept başlıklar için şimdilik bu kadar.. parametreli başlıkları da ayrı bir başlıkta anlatmak istediğimden bu başlıklara Parametreleri eklemedim.

iyi çalışmalar.

önemini  bugünlerde uğraştığım  http tts server kodlarken daha iyi anladığım bu başlık gönderdiğimiz içeriğin uzunluğunu byte cinsinden tutar. server taraflı her zaman cevap için yazılan bu başlık client tarafında sadece form işlemlerinde gonderilir.

Örnek bi İstek Başlığı ve içeriği

POST /yorum_kaydet.php HTTP/1.1
Accept:*/*
Accept-Encoding:gzip,deflate
Connection:Keep-Alive
Host:tufyta.com
Content-Length:26

adi=tufan&soyadi=yildirim

Content-Length body kısmında gönderdiğimi “adi=tufan&soyadi=yildirim” kısmının uzunluğudur. accept-charsete göre bu utf8 olsaydı unicode karakterler olmadığı için yine aynı uzunluk olacaktı ama (ç,ç,ğ vs..) karkaterlerimiz olsaydı her arf için min +1 byte eklemek zorunda kalacaktık. bunun da kontrolu zor değil utf yaptıktan sonraki Size bize bu değeri verecektir.

Örnek Cevap Başlığı ve İçeriği

HTTP 200 Aferin.!
Content-Type:text/html
Content-Length:20
Connection:Close

adiniz guncellendi

istekte gzip ve deflate kabul ettiğimizi söyledik ama cevapta bunu örnek olarak yazamayacağımız için geçtik. sayfa içeriğinde yine Content-Length: in belirttiği kadar karakter var.

iyi çalışmalar…

merhaba arkadaşlar, önceki yazılarımda cıktı sıkıştırmanın önemini ve http protokolunde encoding iletişimini anlatmıştım. asp.net ile bunları nasıl uygularız şimdi de onu anlatalım. ilk önce output müdahale için Response objemizi kullanacağımızı soylemek istiyorum. php ile kıyaslayıp daha anlaşılır hale getirmek istersek. aspxte her zaman output buffer başlatılıyor istediimiz yerde müdahale edip bunu istediğimizi gibi cıktı olarak veriyoruz.
bize Response.Filter gibi şahane bir de kapı bırakıyor aspx. bu filter sayesinde istediğimiz gibi fonksiyonlardan geçirip cıktıyı istediğimiz gibi kontrol edebiliyoruz. 

şimdi System.IO.Compression namespace den yararlanarak gzip ve deflate ile sıkıştırılmış cıktılar verelim tarayıcıya. ne yazıkki php gibi accept-encoding bilgisini kendisi kontrol etmiyor bunu da biz kontrol etmeliyiz. 

HttpContext.Current objesindeki Request bizim için Client. Response ise server taraflı cıktı ya da istek oluyor. 

HttpContext.Current.Request.Headers; dizi içerisinde client tarafından gönderilen header bilgilerini kontrol edip buna göre biz de cıktı vermeye calışacağız. kontrol edeceğimiz satır yine Accept-Encoding olacak. 

stringAcceptEncoding = HttpContext.Current.Request.Headers["Accept-Encoding"];   

string  türündeki AcceptEncoding değişkenimize  clienttan gelen Accept-Encoding  satırındaki bilgileri aldık. bunların hangi tarayıcılarda nasıl geldiğine gözatmışmık. 

Response.Filter =
new System.IO.Compression.DeflateStream(Response.Filter,System.IO.Compression.CompressionMode.Compress);
  

 

asdbahsettiğimiz  filter işlemini de Response.Filter işlemiyle cok kolay uygulayabiliyor  ama biz her tarayıcının bunu desteklemediğini ya da her sitemize giren ziyaretçinin  gerçek tarayıcı olmadığını varsayarsak bunu kontrol edip cıktı vermemiz gerekiyor.

0
1
2
3
4
5
6
7
8
9
10
11
12
        string AcceptEncoding = HttpContext.Current.Request.Headers["Accept-Encoding"];
            if (AcceptEncoding.Contains("deflate"))
            {
                Response.Filter = new System.IO.Compression.DeflateStream(Response.Filter,
                                           System.IO.Compression.CompressionMode.Compress);
                Response.AppendHeader("Content-Encoding", "deflate");
            }
            else if (AcceptEncoding.Contains("gzip"))
            {
                Response.Filter = new System.IO.Compression.GZipStream(Response.Filter,
                                          System.IO.Compression.CompressionMode.Compress);
                Response.AppendHeader("Content-Encoding", "gzip");
            }

Headers dizisinden aldığımız Accept-Encoding  bilgisine göre ilk once deflate sonra gzip kontrolumuzu yapıp cıktımızı Filtreye tabi tuttuk tabi cevaba yani Response Headera  Content-Encoding satırında gzip ya da deflate de eklemeyi unutmadık. yoksa tarayıcı bunu ekrana veremezdi.

iyi çalışmalar.

© 2012 Tufan Suffusion theme by Sayontan Sinha