Skip to content

Instantly share code, notes, and snippets.

Created September 10, 2013 20:46
Show Gist options
  • Save anonymous/6515451 to your computer and use it in GitHub Desktop.
Save anonymous/6515451 to your computer and use it in GitHub Desktop.
require 'socket'
class Server
def initialize(base, request, server_name, session, charset)
@base = base
@request = request
@charset = charset
@server_name = server_name
@session = session
serve()
end
def serve
access_log
get_address()
@content_type = get_content_type()
@session.print "HTTP/1.1 200 OK\r\nServer: #{@server_name}\r\nContent-Type: #{@content_type}; charset=@{charset}\r\n\r\n"
get_file()
@base = nil
@request = nil
@server_name = nil
@content_type
@session.close
puts "Session Ended\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
@session = nil
end
def access_log
File.open(File.join(@base, "data/access_log.txt"), "w") do |log|
log.puts "#{Time.now.localtime.strftime("%Y/%m/%d %H:%M:%S")} #{@session.peeraddr[2]}:#{@session.peeraddr[1]} #{@request}"
end
end
def get_address
src = @request.gsub(/GET /, '').gsub(/ HTTP.*/, '').strip
@src = (@base + "root" + src).gsub('/', '\\')
end
def get_content_type()
ext = File.extname(@src)
content_type = case ext
when /\.html?/
"text/html"
when ".txt"
"text/plain"
when ".css"
"text/css"
when /\.jpe?g/
"image/jpeg"
when ".gif"
"image/gif"
when ".bmp"
"image/bmp"
when ".rb"
"text/plain"
when /\.x[ms]l/
"text/xml"
else
"text/html"
end
content_type
end
def get_file()
begin
if !File.exist?(@src)
puts "File: #{@src} could not be found"
if @content_type["image"]
File.open(File.join(@base, "root", "server_files", "broken_image.png"), "rb") do |image|
@session.puts image.read
end
else
File.foreach(File.join(@base, "root", "server_files", "error404.html")) do |li|
@session.puts li
end
end
else
puts "File #{@src} was opened"
File.foreach(@src) do |li|
@session.puts li
end
end
rescue Exception => e
puts e.message
end
end
end
base = "C:/Base/"
server_name = "Some Server"
host = "localhost"
port = 80
charset = "UFT-8"
server = TCPServer.new(host, port)
puts "~ Server hosted on #{host}:#{port} ~\n====================================\n"
loop {
Thread.new(server.accept) do |session|
request = session.gets
puts "#{session.peeraddr[2]}:#{session.peeraddr[1]} #{request}"
Server.new(base, request, server_name, session, charset)
end
}
p = gets.chomp
server.close
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment