}
// CONNECT requests are proxy requests. Not to be forwarded to origin servers.
- if (p->options.originserver && request->method == METHOD_CONNECT)
+ // Unless the destination port matches, in which case we MAY perform a 'DIRECT' to this peer.
+ if (p->options.originserver && request->method == METHOD_CONNECT && request->port != p->in_addr.GetPort())
return 0;
if (p->peer_domain == NULL && p->access == NULL)
err->callback_data = tunnelState;
errorSend(tunnelState->client.fd(), err);
} else {
- if (tunnelState->servers->_peer)
+ if (tunnelState->servers->_peer && !tunnelState->servers->_peer->options.originserver)
tunnelProxyConnected(tunnelState->server.fd(), tunnelState);
else {
tunnelConnected(tunnelState->server.fd(), tunnelState);
if (fs->_peer) {
tunnelState->request->peer_login = fs->_peer->login;
- tunnelState->request->flags.proxying = 1;
+ tunnelState->request->flags.proxying = (fs->_peer->options.originserver?0:1);
} else {
tunnelState->request->peer_login = NULL;
tunnelState->request->flags.proxying = 0;