HTTPServerRequestImpl::HTTPServerRequestImpl(HTTPServerResponse& response, HTTPServerSession& session, HTTPServerParams* pParams): _response(response), _pStream(0), _pParams(pParams) { poco_check_ptr (_pParams); _pParams->duplicate(); HTTPHeaderInputStream hs(session); read(hs); // Now that we know socket is still connected, obtain addresses _clientAddress = session.clientAddress(); _serverAddress = session.serverAddress(); if (getChunkedTransferEncoding()) _pStream = new HTTPChunkedInputStream(session); else if (getContentLength() != HTTPMessage::UNKNOWN_CONTENT_LENGTH) _pStream = new HTTPFixedLengthInputStream(session, getContentLength()); else if (getMethod() == HTTPRequest::HTTP_GET || getMethod() == HTTPRequest::HTTP_HEAD) _pStream = new HTTPFixedLengthInputStream(session, 0); else _pStream = new HTTPInputStream(session); }
std::pair<std::ostream *, std::ostream *> HTTPServerResponseImpl::beginSend() { poco_assert (!_pStream); poco_assert (!_pHeaderStream); // NOTE Code is not exception safe. if ((_pRequest && _pRequest->getMethod() == HTTPRequest::HTTP_HEAD) || getStatus() < 200 || getStatus() == HTTPResponse::HTTP_NO_CONTENT || getStatus() == HTTPResponse::HTTP_NOT_MODIFIED) { throw Exception("HTTPServerResponse::beginSend is invalid for HEAD request"); } else if (getChunkedTransferEncoding()) { _pHeaderStream = new HTTPHeaderOutputStream(_session); beginWrite(*_pHeaderStream); _pStream = new HTTPChunkedOutputStream(_session); } else if (hasContentLength()) { throw Exception("HTTPServerResponse::beginSend is invalid for response with Content-Length header"); } else { _pStream = new HTTPOutputStream(_session); _pHeaderStream = _pStream; setKeepAlive(false); beginWrite(*_pStream); } return std::make_pair(_pHeaderStream, _pStream); }
void PostRequest::prepareRequest() { _form.prepareSubmit(*this); // \TODO Fix for Poco Bug // https://github.com/pocoproject/poco/issues/1331 if (!getChunkedTransferEncoding()) { // TODO: This long thing is a work-around for bug https://github.com/pocoproject/poco/issues/1337 setContentLength(_form.getEncoding() == Poco::Net::HTMLForm::ENCODING_URL ? 0 : _form.calculateContentLength()); } }
std::ostream& HTTPServerResponseImpl::send() { poco_assert (!_pStream); if ((_pRequest && _pRequest->getMethod() == HTTPRequest::HTTP_HEAD) || getStatus() < 200 || getStatus() == HTTPResponse::HTTP_NO_CONTENT || getStatus() == HTTPResponse::HTTP_NOT_MODIFIED) { Poco::CountingOutputStream cs; write(cs); _pStream = new HTTPFixedLengthOutputStream(_session, cs.chars()); write(*_pStream); } else if (getChunkedTransferEncoding()) { HTTPHeaderOutputStream hs(_session); write(hs); _pStream = new HTTPChunkedOutputStream(_session); } else if (hasContentLength()) { Poco::CountingOutputStream cs; write(cs); #if defined(POCO_HAVE_INT64) _pStream = new HTTPFixedLengthOutputStream(_session, getContentLength64() + cs.chars()); #else _pStream = new HTTPFixedLengthOutputStream(_session, getContentLength() + cs.chars()); #endif write(*_pStream); } else { _pStream = new HTTPOutputStream(_session); setKeepAlive(false); write(*_pStream); } return *_pStream; }