Esempio n. 1
0
void QHttpResponse::writeHeaders()
{
	Q_ASSERT(! m_isDone);
	Q_ASSERT(m_connection);

	QHashIterator<QString, QString> headerIterator(m_headers);

	while( headerIterator.hasNext() )
    {
		headerIterator.next();
		const QString& name = headerIterator.key();
		const QString& value = headerIterator.value();

        if( name.compare("connection", Qt::CaseInsensitive) == 0 ) 
        {
            m_sentConnectionHeader = true;
            if( value == "close" )
                m_last = true;
            else
                m_keepAlive = true;
        }
        else if( name.compare("transfer-encoding", Qt::CaseInsensitive) == 0 )
        {
            m_sentTransferEncodingHeader = true;
            if( value == "chunked" )
                m_useChunkedEncoding = true;
        }
        else if( name.compare("content-length", Qt::CaseInsensitive) == 0 )
        {
            m_sentContentLengthHeader = true;
        }
        //TODO: Expect case

        m_connection->writeHeader(name.toAscii(), value.toAscii());
    }

    if( !m_sentConnectionHeader )
    {
        if( m_keepAlive &&
                ( m_sentContentLengthHeader || m_useChunkedEncoding ) )
        {
            m_connection->writeHeader("Connection", "keep-alive");
        }
        else
        {
            m_last = true;
            m_connection->writeHeader("Connection", "close");
       } 
    }

    if( !m_sentContentLengthHeader && !m_sentTransferEncodingHeader )
    {
        if( m_useChunkedEncoding )
            m_connection->writeHeader("Transfer-Encoding", "chunked");
        else
            m_last = true;
    }
}
bool HTTPHeaderParameterMapper::DoGetStream(const char *key, std::ostream &os, Context &ctx, ROAnything info) {
	StartTrace1(HTTPHeaderParameterMapper.DoGetStream, "Key:<" << NotNull(key) << ">");
	bool mapSuccess = true;
	ROAnything headerfields(ctx.Lookup(key));
	TraceAny(headerfields, "Headerfields available for key " << key);
	if (!headerfields.IsNull()) {
		String strFieldName;
		ROAnything roaValue;
		AnyExtensions::Iterator<ROAnything> headerIterator(headerfields);
		while (headerIterator.Next(roaValue)) {
			if (headerIterator.SlotName(strFieldName)) {
				strFieldName.ToUpper();
				String strKey(constants::suppressName);
				strKey.Append('.').Append(strFieldName);
				Trace("trying to Lookup [" << strKey << "] in own or config");
				// map non suppressed headerfields
				if (Lookup(strKey).AsLong(0L) == 0L) {
					Anything value;
					ROAnything rvalue;
					Trace("slot: " << strFieldName);
					if (!Get(strFieldName, value, ctx)) {
						rvalue = roaValue;
					} else {
						rvalue = value;
					}
					coast::http::putHeaderFieldToStream(os, ctx, strFieldName, rvalue);
				}
			}
		}
	} else {
		TraceAny(ctx.GetTmpStore(), "no headers, get ReqHeader in tmp store:");
		String strHeaderfields;
		if ((mapSuccess = Get("ReqHeader", strHeaderfields, ctx))) {
			os << strHeaderfields;
		}
	}
	Trace("retval: " << mapSuccess);
	return mapSuccess;
}