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);
}
Beispiel #2
0
void Socket::initSndRcv(const int isUinx)
{
    setNotLinger();
    setKeepAlive();
    setNoBuf();
    if (isUinx) return;
}
void EAbstractSocketSessionConfig::doSetAll(EIoSessionConfig* config) {
	ESocketSessionConfig* ssc = dynamic_cast<ESocketSessionConfig*>(config);
	if (!ssc) {
		return;
	}

	EAbstractSocketSessionConfig* cfg = dynamic_cast<EAbstractSocketSessionConfig*>(config);
	if (cfg) {
        // Minimize unnecessary system calls by checking all 'propertyChanged' properties.
        if (cfg->isKeepAliveChanged()) {
            setKeepAlive(cfg->isKeepAlive());
        }
        if (cfg->isOobInlineChanged()) {
            setOobInline(cfg->isOobInline());
        }
        if (cfg->isReceiveBufferSizeChanged()) {
            setReceiveBufferSize(cfg->getReceiveBufferSize());
        }
        if (cfg->isReuseAddressChanged()) {
            setReuseAddress(cfg->isReuseAddress());
        }
        if (cfg->isSendBufferSizeChanged()) {
            setSendBufferSize(cfg->getSendBufferSize());
        }
        if (cfg->isSoLingerChanged()) {
            setSoLinger(cfg->getSoLinger());
        }
        if (cfg->isTcpNoDelayChanged()) {
            setTcpNoDelay(cfg->isTcpNoDelay());
        }
        if (cfg->isTrafficClassChanged() && getTrafficClass() != cfg->getTrafficClass()) {
            setTrafficClass(cfg->getTrafficClass());
        }
    } else {
        ESocketSessionConfig* cfg = dynamic_cast<ESocketSessionConfig*>(config);
        setKeepAlive(cfg->isKeepAlive());
        setOobInline(cfg->isOobInline());
        setReceiveBufferSize(cfg->getReceiveBufferSize());
        setReuseAddress(cfg->isReuseAddress());
        setSendBufferSize(cfg->getSendBufferSize());
        setSoLinger(cfg->getSoLinger());
        setTcpNoDelay(cfg->isTcpNoDelay());
        if (getTrafficClass() != cfg->getTrafficClass()) {
            setTrafficClass(cfg->getTrafficClass());
        }
    }
}
Beispiel #4
0
bool TransportTCP::initializeSocket()
{
  ROS_ASSERT(sock_ != ROS_INVALID_SOCKET);

  if (!setNonBlocking())
  {
    return false;
  }

  setKeepAlive(s_use_keepalive_, 60, 10, 9);

  // connect() will set cached_remote_host_ because it already has the host/port available
  if (cached_remote_host_.empty())
  {
    if (is_server_)
    {
      cached_remote_host_ = "TCPServer Socket";
    }
    else
    {
      std::stringstream ss;
      ss << getClientURI() << " on socket " << sock_;
      cached_remote_host_ = ss.str();
    }
  }

  if (local_port_ < 0)
  {
    la_len_ = s_use_ipv6_  ? sizeof(sockaddr_in6) : sizeof(sockaddr_in);
    getsockname(sock_, (sockaddr *)&local_address_, &la_len_);
    switch (local_address_.ss_family)
    {
      case AF_INET:
        local_port_ = ntohs(((sockaddr_in *)&local_address_)->sin_port);
        break;
      case AF_INET6:
        local_port_ = ntohs(((sockaddr_in6 *)&local_address_)->sin6_port);
        break;
    }
  }

#ifdef ROSCPP_USE_TCP_NODELAY
  setNoDelay(true);
#endif

  ROS_ASSERT(poll_set_ || (flags_ & SYNCHRONOUS));
  if (poll_set_)
  {
    ROS_DEBUG("Adding tcp socket [%d] to pollset", sock_);
    poll_set_->addSocket(sock_, boost::bind(&TransportTCP::socketUpdate, this, _1), shared_from_this());
  }

  if (!(flags_ & SYNCHRONOUS))
  {
    //enableRead();
  }

  return true;
}
Beispiel #5
0
  int Listener::open(const struct sockaddr *sa, int socklen, int backlog){
    int family = sa ? sa->sa_family : AF_UNSPEC;
    if (backlog == 0)
      return -1;
    evutil_socket_t fd = socket(family, SOCK_STREAM, 0);
    if (fd == -1)
      return -1;
    if (evutil_make_socket_nonblocking(fd) < 0) {
      evutil_closesocket(fd);
      return -1;
    }

    if (flags & LEV_OPT_CLOSE_ON_EXEC) {
      if (evutil_make_socket_closeonexec(fd) < 0) {
        evutil_closesocket(fd);
        return -1;
      }
    }

    if (setKeepAlive(fd)) {
      evutil_closesocket(fd);
      return -1;
    }
    if (flags & LEV_OPT_REUSEABLE) {
      if (evutil_make_listen_socket_reuseable(fd) < 0) {
        evutil_closesocket(fd);
        return -1;
      }
    }

    if (sa) {
      if (bind(fd, sa, socklen)<0) {
        evutil_closesocket(fd);
        return -1;
      }
    }

    int ret = this->open(fd, backlog);
    if (ret <0){
      evutil_closesocket(fd);
      return ret;
    }
    return 0;
  }
bool TransportTCP::initializeSocket()
{
    ROS_ASSERT(sock_ != ROS_INVALID_SOCKET);

    if (!setNonBlocking())
    {
        return false;
    }

    setKeepAlive(s_use_keepalive_, 60, 10, 9);

    // connect() will set cached_remote_host_ because it already has the host/port available
    if (cached_remote_host_.empty())
    {
        if (is_server_)
        {
            cached_remote_host_ = "TCPServer Socket";
        }
        else
        {
            std::stringstream ss;
            ss << getClientURI() << " on socket " << sock_;
            cached_remote_host_ = ss.str();
        }
    }

#ifdef ROSCPP_USE_TCP_NODELAY
    setNoDelay(true);
#endif

    ROS_ASSERT(poll_set_ || (flags_ & SYNCHRONOUS));
    if (poll_set_)
    {
        ROS_DEBUG("Adding tcp socket [%d] to pollset", sock_);
        poll_set_->addSocket(sock_, boost::bind(&TransportTCP::socketUpdate, this, _1), shared_from_this());
    }

    if (!(flags_ & SYNCHRONOUS))
    {
        //enableRead();
    }

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