Skip to content

Instantly share code, notes, and snippets.

@tra38

tra38/pages.rb Secret

Last active January 3, 2016 18:22
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tra38/5302630c9d57771fde99 to your computer and use it in GitHub Desktop.
Save tra38/5302630c9d57771fde99 to your computer and use it in GitHub Desktop.
The New Webserver
class Page
attr_reader :page, :error_code, :bytesize, :resource
def initialize(args)
@page = args[:page]
@error_code = args[:error_code]
@bytesize = @page.bytesize
@resource = args[:resource]
end
def headers
<<-EOT
HTTP/1.1 #{error_code}
Content Type: text/html
Content-Length #{bytesize}
Connection: close
EOT
end
end
require 'socket'
require_relative 'pages'
homepage = Page.new(
page: %{
<html>
<head>
<title>Welcome</title>
</head>
<body>
<h1>Hello World!</h1>
<p>Welcome to the world's simplest Web Server.</p>
<p><img src='http://i.imgur.com/A3crbYQ.gif'></p>
</body>
</html>
},
error_code: 200)
error_page = Page.new(
page: %{
<html>
<head>
<title>404 Error Page</title>
</head>
<body>
<strong><p>This is my 404 error page.</p></strong>
</body>
</html>
},
error_code: 404)
profile = Page.new(
page: %{
<html>
<head>
<title>My Profile Page</title>
</head>
<body>
<p>This is my profile page.</p>
</body>
</html>
},
error_code: 200)
server = Server.new(2000, [homepage, profile], error_page)
loop do
server.start
server.page_routing
server.stop
end
class Server
attr_reader :server, :client, :port, :pages, :error
def initialize(port, array_of_pages, error_page)
@port = port
@server = TCPServer.new port
@pages = array_of_pages
@error = error_page
end
def start
@client = @server.accept
end
def stop
@client.close
end
def user_request
@client.gets.split(" ")[1]
end
def display_page(page)
@client.puts page.headers
@client.puts page.page
@client.puts "Time is #{Time.now}"
end
def page_routing
request = user_request.to_s
pages.each do |page|
return display_page(page) if page.resource == request
end
display_page(error)
end
end
require_relative '../pages'
require_relative '../server'
RSpec.describe "Server" do
before do
@sample_page = Page.new(
page: %{
<html>
<head>
<title>Welcome</title>
</head>
<body>
<h1>Hello World!</h1>
<p>Welcome to the world's simplest Web Server.</p>
<p><img src='http://i.imgur.com/A3crbYQ.gif'></p>
</body>
</html>
},
error_code: 200, resource: "/home")
@error_page = Page.new(
page: %{
<html>
<head>
<title>404 Error Page</title>
</head>
<body>
<strong><p>This is my 404 error page.</p></strong>
</body>
</html>
},
error_code: 404, resource: nil)
@server = Server.new(2000, [@sample_page], @error_page)
end
it "works" do
p @server.server.accept
# connection.close
# @server.start
# @socket = TCPSocket.new("localhost", @server.port)
# @socket.puts "/home"
# @socket.close_write
# @server.page_routing
# @server.close
# output = @socket.read
output = "DOG"
expect(output).to match /Hello World!/
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment