ساخت یک وب سرور ساده با روبی
چهارشنبه, ۲۰ دی ۱۳۹۱، ۱۲:۲۱ ب.ظ
سلام
امروز چند قطعه کد جالب در مورد ساخت یک وب سرور همانند 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
البته خودم دوست نداشتم از وبلاگ های خارجی کپی پیست کنم ولی خب قطعه کد جالبی بود.
موفق باشد
- چهارشنبه, ۲۰ دی ۱۳۹۱، ۱۲:۲۱ ب.ظ


