Rabu, 15 September 2021

Cara Membuat Web Server dengan Python


 

 Tim Berners-Lee closeup.jpg

Konsep World Wide Web (WWW) yang berjalan diatas jaringan internet, pertama kali diinisiasi oleh Sir Timothy John "Tim" Berners-Lee. Gagasan ini muncul ketika Berners-Lee masih bekerja di CERN (Conseil Européen pour la Recherche Nucléaire). CERN itu sendiri adalah organisasi riset nuklir negara-negara Eropa, yang laboratoriumnya terletak di perbatasan antara Prancis dan Swiss. Kegiatan penelitian nuklir di CERN memang sangat intensif ya. Makanya dokumen-dokumen hasil riset juga sangat banyak. Berners-Lee sendiri, sejak tahun 1980an bekerja disana untuk menangani sistem informasi manajemen dokumen-dokumen tersebut. Inilah foto dari sang penemu WorldWideWeb itu. 

Sekitar bulan Maret tahun 1989, Berners-Lee mengajukan proposal tentang sistem manajemen informasi kepada dewan manajemen CERN. Didalam proposal itu Berners-Lee mencantumkan istilah "web", dimana salah satu inovasi yang diajukan dalam proposal itu adalah manajemen tautan (link) antar dokumen. Manajemen tautan (link) tersebut sampai saat ini masih masuk dalam standar HTML. Saat ini tautan itu diistilahkan hypertext reference atau disingkat href.

    Pada tanggal 12 November 1990, Berners-Lee bersama rekannya Robert Cailliau, menulis proposal resmi yang berisi tentang pengembangan proyek hypertext yang dinamakan "WordWideWeb". Pada tahun 1990 ini Berners-Lee berhasil mengembangkan 3 teknologi dasar yang menjadi basis web yaitu : 1. Unique Device Identification (UDI), dimana kelak dikemudian hari berubah menjadi Uniform Resource Locator (URL) dan Uniform Resource Identifier (URI). 2. Standar dokumen dengan format HyperText Markup Language (HTML) 3. HyperText Transfer Protocol (HTTP). Nah didalam HyperText Transfer Protocol (HTTP) inilah tercantum berbagai macam aturan seperti misalnya aturan aplikasi layanan (service) HTTP Server, aturan aplikasi HTTP Client, beserta aturan-aturan lain yang memuat format data yang dikirim oleh Server dan Client tersebut. Waktu itu service HTTP Server ini dinamakan HyperText Transfer Protocol Daemon atau disingkat httpd. Sedangkan HTTP Client dinamakan WordWideWeb. Saat ini HTTP Server atau httpd lebih dikenal dengan istilah Web Server, 10sedangkan WordWideWeb atau HTTP Client lebih dikenal dengan istilah web browser.

    Secara garis besar, badan yang mengatur standar jaringan internet dan aplikasi yang berjalan diatasnya ada 2 badan besar, yaitu Institute of Electric and Electrical Engineering (IEEE) dan Internet Society (ISOC) beserta sub-sub bagian dibawahnya. IEEE adalah lembaga internasional yang khusus membahas lapisan fisik jaringan. Dimana lapisan fisik jaringan internet ini berhubungan erat dengan teknologi dan komponen elektronika. Sedangkan ISOC itu lebih banyak mengatur masalah aturan data yang mengalir di internet, pengalamatan jaringan internet dan perangkat lunak (software) yang berjalan di atas jaringan internet.


    Diatas sempat saya singgung sedikit mengenai RFC. Di bagian Ini akan saya perjelas lagi tentang apa itu RFC. Diatas sudah saya sampaikan, bahwa perkembangan World Wide Web (www) sejak dari tahun 1990 sampai saat ini sudah sangat pesat. Tentu dari pekembangan ini sangat terkait dengan berbagai macam kepentingan kan ya? Mulai dari kepentingan sekedar saling berbagi informasi, kepentingan bisnis, sampai kepentingan yang menyangkut kedaulatan negara. Nah bayangkan kalau World Wide Web itu tidak diatur, apa yang terjadi? Sangat mungkin akan memunculkan konflik sosial, sampai dengan monopoli bisnis. Bahkan akibat dari monopoli bisnis tadi bisa merembet ke konflik antar negara. Untuk itulah badan-badan internasional dan konsorsium internasional perlu dibentuk, untuk mengatur standarisasi teknologinya itu tadi.

    Nah RFC atau kepanjangan dari Request For Comments itu serial dokumen protokol standar yang diterbitkan oleh lembaga-lembaga internasional dibawah naungan Intenet Society (ISOC). Sampai saat ini, ISOC itu sendiri masih dibawah koordinasi World Wide Web Consortium (W3C). Dimana W3C itu sendiri, sampai artikel ini saya tulis masih dikepalai oleh Tim Berners-Lee, sang penemu www itu sendiri.

    Dokumen pertama kali yang ditulis oleh tim penyunting RFC tercatat mulai tahun 1968. Dan dari tahun 1968 itu dokumen RFC terus bertambah sampai sekarang. Jumlah dokumen RFC sejak tahun 1968 sampai tahun 2020 tercatat sudah mencapai angka 8.715 dokumen. Delapan ribu dokumen protokol standar inilah yang akhirnya dipatuhi oleh berbagai macam kalangan, terutama pengembang aplikasi world wide web dan aplikasi yang berjalan diatas protokol internet lainnya.

    Muncul pertanyaan. Kalau kita mau mengembangkan aplikasi web, apakah kita harus memahami semua dokumen RFC yang berjumlah 8.715 itu? Ya tentu saja tidak. Untuk bisa mengembangkan aplikasi web, maka kita hanya perlu memahami dam mampu mengimplementasikan setidaknya 4 standar RFC saja, yaitu :

  1. RFC 2068 yang membahas tentang standar Hyper Text Transfer Protocol version 1.1. Didalam RFC ini, ada bagian khusus yang membahas tentang format data permintaan (request) yaitu pada section 5. Sedangkan section 6 membahas tentang format data status yang dikirim (response status) dari server (httpd) ke client (browser)
  2. RFC 1928 yang membahas tentang komunikasi data dengan memanfaatkan socket
  3. RFC 1738 yang membahasa tentang penentuan alamat jaringan (Domain Name), nama berkas (file) dan data yang dikemas dengan istilah Uniform Resource Locator atau disingkat URL.
  4. RFC 1866 yang membahas tentang format dokumen yang dikirim dari server ke client. Dimana format dokumen ini menggunakan protokol standar Hyper Text Markup Language atau disingkay (HTML).

Agar mudah untuk dipahami, gambar dibawah ini merupakan ilustrasi bagaimana model komunikasi antara server dengan client dan protokol RFC yangterkait dengan komunikasi data tersebut.

 

RFC 2068 : Hypertext Transfer Protocol Ver 1.1 (HTTP1.1) 

    Hypertext Transfer Protocol (HTTP) adalah protokol tingkat aplikasi untuk sistem informasi terdistribusi, kolaboratif, dan hypermedia. HTTP telah digunakan oleh inisiatif informasi global World-Wide Web sejak tahun 1990. Versi pertama HTTP, disebut sebagai HTTP/0.9, adalah protokol sederhana untuk transfer data mentah di Internet. HTTP/1.0, seperti yang didefinisikan oleh RFC 1945, meningkatkan protokol dengan mengizinkan pesan dalam format pesan seperti MIME, yang berisi informasi meta tentang data yang ditransfer dan pengubah pada semantik permintaan/tanggapan. Namun, HTTP/1.0 tidak cukup mempertimbangkan efek dari proxy hierarkis, caching, kebutuhan akan koneksi persisten, dan host virtual. Selain itu, penyebaran aplikasi yang diimplementasikan tidak lengkap yang menyebut diri mereka "HTTP/1.0" telah mengharuskan perubahan versi protokol agar dua aplikasi yang berkomunikasi dapat menentukan kemampuan sebenarnya masing-masing. Karena HTTP/1.0 masih ada kelemahan, maka perbaikannya disajikan dalam RFC 2068 ini, dan selanjutnya versi protokol HTTP-nya dirubah menjadi versi 1.1 atau HTTP/1.1.

RFC 1928 : TCP Connection Protokol HTTP/1.1

    inilah menjadi induk dari seluruh protokol lainnya yang terlibat didalam serangkaian sistem Hypertext Transfer Protocol atau sistem World Wide Web. Pada RFC ini salah satu yang dibahas adalah connection (koneksi). Dimana koneksi ini definisinya adalah sirkuit virtual (virtual circuit) pada lapisan transport (transport layer) yang terdiri dari dua program untuk tujuan komunikasi. Yang dimaksud dua program disini adalah program server dan program client. Pada sub bab connection ini juga disebutkan bahwa protokol transport yang digunakan adalah Tranfer Control Protocol atau disingkat TCP.

Program server adalah program aplikasi yang menerima koneksi untuk melayani permintaan dengan mengirimkan kembali tanggapan. Setiap program yang diberikan mungkin mampu menjadi klien dan server; penggunaan istilah ini oleh kami hanya mengacu pada peran yang dilakukan oleh program untuk koneksi tertentu, bukan kemampuan program secara umum. Demikian juga, setiap server dapat bertindak sebagai server asli (origin server), proxy, gateway, atau tunnel (terowongan)yang bisa mengalihkan perilaku (switching behaviour) berdasarkan sifat setiap permintaan (request).

    Sedangkan program client adalah program yang memulai permintaan (request initiation). Ini sering berupa browser, editor, spider (robot penjelajah web), atau alat pengguna akhir lainnya. Program client inilah yang nantinya dioperasikan oleh pengguna (user). Dikarenakan untuk komunikasi data kita menggunakan standard Socket (RFC 1928) dan protokol yang digunakan adalah TCP, maka skema connection ini tentunya mengikuti skema socket berbasis TCP. Bagaimana skema dasar dari connetion ini? Silahkan diamati pada ilustrasi gambar berikut ini.

RFC 1738 : Uniform Resource Locator (URL)

 Agar program client bisa terhubung dengan program server, atau istilahnya adalah membangun koneksi (establish connection), maka perlu ada standar khusus yang mengatur tentang hal itu. Standar yang dimaksud tertuang dalam RFC 1738 yang berisi standar Uniform Resource Locator atau disingkat URL. Dalam penggunaan kesehariannya, biasanya kita mengetikkan URL ini pada address bar pada browser kita.

Adapun aturan penulisan URL menurut RFC 1738 itu, khusus untuk protokol
HTTP adalah seperti berikut ini.
[http|https]://www.[host:port]/path/filename?param-1=data-1&param-n=data-n
 
Contoh :
● https://www.google.com/index.html
● https://www.facebook.com/index.php?groups=2920223131408328
● https://www.google.com/search?q=rfc+2068&sxsrf=ALeKk00
● http://www.localhost:8080/index.html

    Jika pada penulisan URL port tidak didefinikan, maka otomatis port akan terisi 80. Karena dalam konsensus protokol http, port yang digunakan adalah 80. Hanya untuk keperluan pengembangan aplikasi, kita bisa menggunakan port berapapun asalkan tidak bentrok dengan aplikasi lainnya. Nanti setelah aplikasinya dipasang di server yang sesungguhnya, maka port aplikasi harus dirubah menjadi 80.

RFC 2068-Section 5 : Request Message (Pesan Permintaan) 

    Setelah program client dan server terhubung, maka langkah pertama adalah program client mengirimkan pesan (request message) ke program server. Isi dari pesan permintaan (request message) ini sudah diatur pada RFC 2068 section 5. Ini saya contohkan isi pesan permintaan.

GET /index.html HTTP/1.1
Host: 127.0.0.1:8080
Connection: keep-alive
sec-ch-ua: " Not A;Brand";v="99", "Chromium";v="90", "Google
Chrome";v="90"
sec-ch-ua-mobile: ?0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like
Gecko) Chrome/90.0.4430.85 Safari/537.36
Accept:
text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/web
p,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9

Dari contoh diatas, aturan penulisan isi pesan permintaan (request
message) yang ditetapkan pada RFC 2616 terdapat 2 bagian pokok yaitu :
1. Request-line
2. Request Header Fields


RFC 2068-Section 6 : Response 

    Setelah server menerima dan menafsirkan pesan permintaan (request message), maka server merespon client dengan pesan respons HTTP (HTTP Response Message). Pada intinya isi dari response message itu adalah 
Response = status-line CRLF header CRLF message body
 

Langkah-Langkah Membuat Web Server Statis dengan Python

Sebelum memulai, pastikan komputer Anda telah terinstall Python. Untuk memeriksa apakah Python sudah terinstal maka ketikan perintah berikut di terminal :



Jika Python sudah terinstall maka akan muncul tulisan versi Python. Berikut ini contohnya :



silahkan buat folder dan file dengan nama-nama seperti gambar dibawah ini. Saya tidak akan membahas bagaimana membuat file HTML dan CSS seperti yang berada di folder htdocs ya. Karena file-file HTML dan CSS ini sudah saya bahas di artikel yang terpisah. Disini saya akan fokus untuk membahas implementasi algoritma web server menggunakan bahasa pemrograman python. Jadi nanti yang akan saya sajikan adalah bagaimana membuat program webserver.py berdasarkan algoritma.

Source code selengkapnya dari algoritma, terlihat seperti gambar berikut ini.

  1.        import socket
  2.        import os
  3.        import mimetypes

  4.        def tcp_server():
  5.              SERVER_HOST = '127.0.0.1'
  6.              SERVER_PORT = 8080
  7.              server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  8.              server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
  9.              server_socket.bind((SERVER_HOST, SERVER_PORT))
  10.              server_socket.listen()
  11.              print('Listen on http://127.0.0.1:8080')
  12.              while True:
  13.                     client_connection, client_address = server_socket.accept()
  14.                     #request
  15.                     request = client_connection.recv(1024).decode()
  16.                     #handle request
  17.                     response = handle_request(request)
  18.                     #response
  19.                     client_connection.sendall(response)
  20.                     client_connection.close()
  21.              server_socket.close()

  22.        def handle_request(request):
  23.              request_message = str(request).split("\r\n")
  24.              request_line = request_message[0]
  25.              words = request_line.split()
  26.              method = words[0]
  27.              uri = words[1].strip("/")
  28.              http_version = words[2]
  29.              if(uri == ''):
  30.                     uri = 'index.html'
  31.              if(method == 'GET'):
  32.                    response = handle_get(uri, http_version)
  33.             return response

  34.        def handle_get(uri, http_version):
  35.              uri = "htdocs/%s"%(uri)
  36.              if os.path.exists(uri) and not os.path.isdir(uri):
  37.                     response_line = b''.join([http_version.encode(), b'200', b'OK'])
  38.                     content_type = mimetypes.guess_type(uri)[0] or 'text/html'
  39.                     entity_header = b''.join([b'Content-type: ', content_type.encode()])
  40.                     file = open(uri, 'rb')
  41.                     message_body = file.read()
  42.                     file.close()
  43.              else :
  44.                     response_line = b''.join([http_version.encode(), b'404', b'Not Found'])
  45.                     entity_header = b'Content-Type: text/html'
  46.                     message_body = b'<h1>404 Not Found</h1>'
  47.             crlf = b'\r\n'
  48.             response = b''.join([response_line, crlf, entity_header, crlf, crlf, message_body])
  49.             return response

  50. if __name__ == "__main__":
  51.        tcp_server()


Kalau program webserver itu dijalankan, maka pada terminal akan muncul tampilan seperti ini

Coba sekarang buka browser anda, kemudian pada browser ketikkan alamat URL : http://127.0.0.1:8080 atau http://localhost:8080 maka seharusnya pada browaer anda akan tampil seperti ini.


Oke, sampai dengan pembahasan metode GET (handle GET) seperti ilustrasi diatas, maka kita sudah bisa menangani website statis. Artinya website statis ini model arus informasinya hanya satu arah yaitu informasi dari server ke client saja. Disini pengguna (user) hanya bisa menerima data, tanpa bisa melakukan interaksi lebih jauh lagi. Contoh interaksi yang dimaksud misalnya pengguna (user) mengirimkan data nama pengguna, password, dan data-data lainnya. Pada bagian selanjutnya, akan saya
bahas mengenai implementasi method POST, PUT, DELETE dsb.
 
Referensi : 
 https://id.wikipedia.org/wiki/Tim_Berners-Lee
https://nuriasafitri25.blogspot.com/2021/09/cara-membuat-web-server-statis.html

Tidak ada komentar:

Posting Komentar

Cara Membuat Database Pada Ms Excel ~ Part 8

    Normalisasi adalah teknik analisis data yg mengorganisasikan atribut-atribut data menggunakan cara mengelompokkan sebagai akibatnya ...