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; }