void HttpSocket::IHttpServer_Respond(const HttpResponse& res) { m_res = res; SetHttpVersion( m_res.HttpVersion() ); SetStatus( Utility::l2string(m_res.HttpStatusCode()) ); SetStatusText( m_res.HttpStatusMsg() ); if (!ResponseHeaderIsSet("content-length")) { AddResponseHeader( "content-length", Utility::l2string( m_res.GetFile().size() ) ); } for (Utility::ncmap<std::string>::const_iterator it = m_res.Headers().begin(); it != m_res.Headers().end(); ++it) { AddResponseHeader( it -> first, it -> second ); } std::list<std::string> vec = m_res.CookieNames(); for (std::list<std::string>::iterator it2 = vec.begin(); it2 != vec.end(); ++it2) { AppendResponseHeader( "set-cookie", m_res.Cookie(*it2) ); } SendResponse(); OnTransferLimit(); }
// -------------------------------------------------------------------------------------- void Ajp13Socket::Respond(const HttpResponse& res) { char msg[8192]; msg[0] = 'A'; msg[1] = 'B'; m_res = res; // reply codes // 0x3 Send Body Chunk // 0x4 Send Headers // 0x5 End Response // 0x6 Get Body Chunk // 0x9 CPong Reply // check content length if (!m_res.ContentLength() && m_res.GetFile().size()) { // m_res.SetContentLength( m_res.GetFile().size() ); } // Send Headers { int ptr = 4; put_byte(msg, ptr, 0x04); // send headers put_integer(msg, ptr, m_res.HttpStatusCode() ); put_string(msg, ptr, m_res.HttpStatusMsg() ); put_integer(msg, ptr, (short)m_res.Headers().size() ); for (Utility::ncmap<std::string>::const_iterator it = m_res.Headers().begin(); it != m_res.Headers().end(); ++it) { Utility::ncmap<int>::const_iterator it2 = Init.ResponseHeader.find( it -> first ); if (it2 != Init.ResponseHeader.end()) { put_integer(msg, ptr, it2 -> second); } else { put_string(msg, ptr, it -> first); } put_string(msg, ptr, it -> second); } std::list<std::string> vec = m_res.CookieNames(); { for (std::list<std::string>::iterator it = vec.begin(); it != vec.end(); it++) { Utility::ncmap<int>::const_iterator it2 = Init.ResponseHeader.find( "set-cookie" ); if (it2 != Init.ResponseHeader.end()) { put_integer(msg, ptr, it2 -> second); } else { put_string(msg, ptr, "set-cookie"); } put_string(msg, ptr, m_res.Cookie(*it) ); } } short len = htons( ptr - 4 ); memcpy( msg + 2, &len, 2 ); SendBuf( msg, ptr ); } // Send Body Chunk OnTransferLimit(); }