ساخت یک وب سرور ساده با روبی
چهارشنبه, ۲۰ دی ۱۳۹۱، ۱۲:۲۱ ب.ظ
سلام
امروز چند قطعه کد جالب در مورد ساخت یک وب سرور همانند IIS ، Apache ، nginx با زبان روبی پیدا کردم.البته نه با قدرت این نرمافزارها! بلکه خیلی ساده تر.
به زودی یک کتاب خوب روبی را آپلود و اگر وقت شد یکم بیشتر در مورد صحبت میکنم.
و حالا کدها با کمی توضیح ....
- ساخت وب سروری که تنها به شما Hello World میگوید :-) (البته در آدرس localhost:2000 و یا IP address: 127.0.0.1:2000)
require "socket" webserver = TCPServer.new('localhost', 2000) while (session = webserver.accept) session.write(Time.now) session.print("Hello World!") session.close end
- وب سروری که قابلیت نمایش دایرکتوری (فولدر) سرور را نیز دارا میباشد.
ادامه در "ادامه مطلب"
require "socket" webserver = TCPServer.new('localhost', 2000) base_dir = Dir.new(".") while (session = webserver.accept) session.print "HTTP/1.1 200/OK\r\nContent-type:text/html\r\n\r\n" base_dir.entries.each do |f| if File.directory? f session.print(" #{f}/ ") else session.print(" #{f} ") end end session.close end
- یک وب دایرکتوری با قابلیت جستجو (به معن یاینکه بتوانید وارد فولدر ها زیر مجموعه شوید!)
require "socket" webserver = TCPServer.new('localhost', 2000) base_dir = Dir.new(".") while (session = webserver.accept) request = session.gets puts request trimmedrequest = request.gsub(/GET\ \//, '').gsub(/\ HTTP.*/, '').chomp resource = trimmedrequest if resource == "" resource = "." end print resource if !File.exists?(resource) session.print "HTTP/1.1 404/Object Not Found\r\nServer Matteo\r\n\r\n" session.close next end if File.directory?(resource) session.print "HTTP/1.1 200/OK\r\nContent-type:text/html\r\n\r\n" if resource == "" base_dir = Dir.new(".") else base_dir = Dir.new("./#{trimmedrequest}") end base_dir.entries.each do |f| dir_sign = "" base_path = resource + "/" base_path = "" if resource == "" resource_path = base_path + f if File.directory?(resource_path) dir_sign = "/" end if f == ".." upper_dir = base_path.split("/")[0..-2].join("/") session.print("#{f}/") else session.print("#{f}#{dir_sign}") end end else ## return file end session.close end
- و قطعه کد آخر که قابلیت نمایش عکس ها و فایل های ساده را در خود مرورگر فراهم میآورد ...
require "socket" def get_content_type(path) ext = File.extname(path) return "text/html" if ext == ".html" or ext == ".htm" return "text/plain" if ext == ".txt" return "text/css" if ext == ".css" return "image/jpeg" if ext == ".jpeg" or ext == ".jpg" return "image/gif" if ext == ".gif" return "image/bmp" if ext == ".bmp" return "text/plain" if ext == ".rb" return "text/xml" if ext == ".xml" return "text/xml" if ext == ".xsl" return "text/html" end webserver = TCPServer.new('localhost', 2000) base_dir = Dir.new(".") while (session = webserver.accept) request = session.gets puts request trimmedrequest = request.gsub(/GET\ \//, '').gsub(/\ HTTP.*/, '').chomp resource = trimmedrequest if resource == "" resource = "." end print resource if !File.exists?(resource) session.print "HTTP/1.1 404/Object Not Found\r\nServer Matteo\r\n\r\n" session.print "404 - Resource cannot be found." session.close next end if File.directory?(resource) session.print "HTTP/1.1 200/OK\r\nContent-type:text/html\r\n\r\n" if resource == "" base_dir = Dir.new(".") else base_dir = Dir.new("./#{trimmedrequest}") end base_dir.entries.each do |f| dir_sign = "" base_path = resource + "/" base_path = "" if resource == "" resource_path = base_path + f if File.directory?(resource_path) dir_sign = "/" end if f == ".." upper_dir = base_path.split("/")[0..-2].join("/") session.print("#{f}/") else session.print("#{f}#{dir_sign}") end end else contentType = get_content_type(resource) session.print "HTTP/1.1 200/OK\r\nServer: Matteo\r\nContent-type: #{contentType}\r\n\r\n" File.open(resource, "rb") do |f| while (!f.eof?) do buffer = f.read(256) session.write(buffer) end end end session.close end
البته خودم دوست نداشتم از وبلاگ های خارجی کپی پیست کنم ولی خب قطعه کد جالبی بود.
موفق باشد
- چهارشنبه, ۲۰ دی ۱۳۹۱، ۱۲:۲۱ ب.ظ