Beispiel #1
0
bool Server::Listen()
{
	m_valid = false;
	if (!m_server.Listen())
		return false;
	//Debug("Handshaking...");
	HTTP::Request handshake;
	if (!handshake.Receive(m_server))
	{
		Error("Failed to process HTTP request");
	}
	map<string, string> & headers = handshake.Headers();
	auto i = headers.find("Sec-WebSocket-Key");
	if (i == headers.end())
	{
		Error("No Sec-WebSocket-Key header!");
		for (i = headers.begin(); i != headers.end(); ++i)
		{
			Error("Key: %s = %s", i->first.c_str(), i->second.c_str());
		}
		return false;
	}
	//Debug("Finished handshake");
	string magic = Foxbox::WS::Magic(i->second);
	
	m_server.Send("HTTP/1.1 101 Switching Protocols\r\n");
	m_server.Send("Upgrade: WebSocket\r\n");
	m_server.Send("Connection: Upgrade\r\n");
	m_server.Send("Sec-WebSocket-Accept: %s\r\n", magic.c_str());
	m_server.Send("Sec-WebSocket-Protocol: %s\r\n\r\n", 
		headers["Sec-WebSocket-Protocol"].c_str());
	m_valid = true;
	return true;
}