/*
* Copyright 2012 Steven Gribble
*
* This file is part of the UW CSE 333 lecture code (333lec).
*
* 333lec is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* 333lec is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with 333proj. If not, see .
*/
#ifndef _HTTPSERVER_H_
#define _HTTPSERVER_H_
#include
typedef void (*HandleFn)(int client_fd,
std::string requested_URL,
std::string client_IP,
unsigned short client_port);
class HttpServer {
public:
// Attempts to create a listening socket on port "port". If
// there is an error creating the listening socket, throws a
// std::runtime_error exception.
HttpServer(std::string portnum);
~HttpServer() { close(listen_fd_); listen_fd_ = 0; }
// Enter the accept/dispatch loop. For each successful client HTTP
// request, invokes "handle".
void AcceptDispatch(HandleFn handle);
private:
// Create a listening socket on port "portnum". Throws a
// std::runtime_error on error. Sets the this->listen_fd_ file
// descriptor on success, as well as this->server_addr_ and
// this->server_port_.
void Listen(std::string portnum);
// Look up the IP address information associated with the socket.
// If "peer" is true, looks up on the peer connected to the
// socket, else looks up on this side of the socket. Throws
// a std::runtime_error on failure.
void GetIPInfo(int fd, bool peer, std::string *addr, std::string *dns) const;
// Read the HTTP request from client_fd, parse out the request URL,
// and return it. Throws a std::runtime_error on failure.
std::string ParseURL(int client_fd);
// The listening socket for the server.
int listen_fd_;
// The IP address, DNS name, and port the server is listening on,
// in string form.
std::string server_addr_;
std::string server_dns_;
std::string server_port_;
};
#endif // _HTTPSERVER_H_