/* * Copyright 2015 Haiku, Inc. * Distributed under the terms of the MIT License. */ #include #include BProxySecureSocket::BProxySecureSocket(const BNetworkAddress& proxy) : BSecureSocket(), fProxyAddress(proxy) { } BProxySecureSocket::BProxySecureSocket(const BNetworkAddress& proxy, const BNetworkAddress& peer, bigtime_t timeout) : BSecureSocket(), fProxyAddress(proxy) { Connect(peer, timeout); } BProxySecureSocket::BProxySecureSocket(const BProxySecureSocket& other) : BSecureSocket(other), fProxyAddress(other.fProxyAddress) { } BProxySecureSocket::~BProxySecureSocket() { } status_t BProxySecureSocket::Connect(const BNetworkAddress& peer, bigtime_t timeout) { status_t status = InitCheck(); if (status != B_OK) return status; status = BSocket::Connect(fProxyAddress, timeout); if (status != B_OK) return status; BString connectRequest; connectRequest.SetToFormat("CONNECT %s:%d HTTP/1.0\r\n\r\n", peer.HostName().String(), peer.Port()); BSocket::Write(connectRequest.String(), connectRequest.Length()); char buffer[256]; ssize_t length = BSocket::Read(buffer, sizeof(buffer) - 1); if (length <= 0) return length; buffer[length] = '\0'; int httpStatus = 0; int matches = sscanf(buffer, "HTTP/1.0 %d %*[^\r\n]\r\n\r\n", &httpStatus); if (matches != 2) return B_BAD_DATA; if (httpStatus < 200 || httpStatus > 299) return B_BAD_VALUE; return _SetupConnect(); }