Esempio n. 1
0
void Pillow::HttpRequestWriter::write(const QByteArray &method, const QByteArray &path, const Pillow::HttpHeaderCollection &headers, const QByteArray &data)
{
	if (_device == 0)
	{
		qWarning() << "Pillow::HttpRequestWriter::write: called while device is not set. Not proceeding.";
		return;
	}

	if (_builder.capacity() < 8192)
		_builder.reserve(8192);

	_builder.append(method).append(' ').append(path).append(Pillow::HttpClientTokens::httpOneOneCrlfToken);

	for (const Pillow::HttpHeader *h = headers.constBegin(), *hE = headers.constEnd(); h < hE; ++h)
		_builder.append(h->first).append(Pillow::HttpClientTokens::colonSpaceToken).append(h->second).append(Pillow::HttpClientTokens::crlfToken);

	if (!data.isEmpty())
	{
		_builder.append(Pillow::HttpClientTokens::contentLengthColonSpaceToken);
		Pillow::ByteArrayHelpers::appendNumber<int, 10>(_builder, data.size());
		_builder.append(Pillow::HttpClientTokens::crlfToken);
	}

	_builder.append(Pillow::HttpClientTokens::crlfToken);

	if (data.isEmpty())
	{
		_device->write(_builder);
	}
	else
	{
		if (data.size() < 4096)
		{
			_builder.append(data);
			_device->write(_builder);
		}
		else
		{
			_device->write(_builder);
			_device->write(data);
		}
	}

	if (_builder.size() > 16384)
		_builder.clear();
	else
		_builder.data_ptr()->size = 0;
}