예제 #1
0
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();
}
예제 #2
0
// --------------------------------------------------------------------------------------
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();
}