int ProxyConn::connectSSL() { if (!m_ssl.getSSL()) { m_ssl.setSSL(getSslConn()); if (!m_ssl.getSSL()) return LS_FAIL; m_ssl.setfd(getfd()); HttpReq *pReq = getConnector()->getHttpSession()->getReq(); char *pHostName; int hostLen = pReq->getNewHostLen(); if (hostLen > 0) pHostName = (char *)pReq->getNewHost(); else { pHostName = (char *)pReq->getHeader(HttpHeader::H_HOST); hostLen = pReq->getHeaderLen(HttpHeader::H_HOST); } if (pHostName) { char ch = *(pHostName + hostLen); *(pHostName + hostLen) = 0; m_ssl.setTlsExtHostName(pHostName); *(pHostName + hostLen) = ch; } } int ret = m_ssl.connect(); switch (ret) { case 0: setSSLAgain(); break; case 1: LS_DBG_L(this, "[SSL] connected!"); break; default: if (errno == EIO) LS_DBG_L(this, "SSL_connect() failed!: %s ", SslError().what()); break; } return ret; }
int ProxyConn::sendReqHeader() { m_iovec.clear(); HttpSession *pSession = getConnector()->getHttpSession(); HttpReq *pReq = pSession->getReq(); //remove the trailing "\r\n" before adding our headers const char *pBegin = pReq->getOrgReqLine(); m_iTotalPending = pReq->getHttpHeaderLen(); int newReqLineLen = 0; int headerLen = 17; char *pExtraHeader = &m_extraHeader[23]; const char *pForward = pReq->getHeader(HttpHeader::H_X_FORWARDED_FOR); int len; if (*pForward != '\0') { len = pReq->getHeaderLen(HttpHeader::H_X_FORWARDED_FOR); if (len > 160) len = 160; memmove(&pExtraHeader[headerLen], pForward, len); headerLen += len; pExtraHeader[headerLen++] = ','; } //add "X-Forwarded-For" header memmove(&pExtraHeader[headerLen], pSession->getPeerAddrString(), pSession->getPeerAddrStrLen()); headerLen += pSession->getPeerAddrStrLen(); pExtraHeader[headerLen++] = '\r'; pExtraHeader[headerLen++] = '\n'; #if 1 //always set "Accept-Encoding" header to "gzip" char *pAE = (char *)pReq->getHeader(HttpHeader::H_ACC_ENCODING); if (*pAE) { int len = pReq->getHeaderLen(HttpHeader::H_ACC_ENCODING); if (len >= 4) { memmove(pAE, "gzip", 4); memset(pAE + 4, ' ', len - 4); } } else { pExtraHeader = m_extraHeader; headerLen += 23; } #endif if (*(pBegin + --m_iTotalPending - 1) == '\r') --m_iTotalPending; if (*pForward) { if ((pBegin + m_iTotalPending) - (pForward + pReq->getHeaderLen(HttpHeader::H_X_FORWARDED_FOR)) == 2) { const char *p = pForward -= 16; while (*(p - 1) != '\n') --p; m_iTotalPending = p - pBegin; } } //reconstruct request line if URL has been rewritten if (pReq->getRedirects() > 0) { const char *pReqLine = pReq->encodeReqLine(newReqLineLen); if (newReqLineLen > 0) { m_iovec.append(pReqLine, newReqLineLen); pBegin += pReq->getOrgReqLineLen() - 9; m_iTotalPending -= pReq->getOrgReqLineLen() - 9; } } int newHostLen = pReq->getNewHostLen(); char *pHost = (char *)pReq->getHeader(HttpHeader::H_HOST); int hostLen = pReq->getHeaderLen(HttpHeader::H_HOST); if (newHostLen > 0) { if (*pHost) { m_iovec.append(pBegin, pHost - pBegin); m_iovec.append(pReq->getNewHost(), newHostLen); m_iovec.append(pHost + hostLen, pBegin + m_iTotalPending - pHost - hostLen); m_iTotalPending += (newHostLen - hostLen); } else { m_iovec.append(pBegin, m_iTotalPending); m_iovec.append("Host: ", 6); m_iovec.append(pReq->getNewHost(), newHostLen); m_iovec.append("\r\n", 2); m_iTotalPending += newHostLen + 8; } } else m_iovec.append(pBegin, m_iTotalPending); m_iTotalPending += newReqLineLen; if (hostLen) { m_iovec.append(s_achForwardHost, sizeof(s_achForwardHost) - 1); m_iovec.append(pHost, hostLen); m_iovec.append("\r\n", 2); m_iTotalPending += hostLen + sizeof(s_achForwardHost) + 1 ; } if (pSession->isSSL()) { m_iovec.append(s_achForwardHttps, sizeof(s_achForwardHttps) - 1); m_iTotalPending += sizeof(s_achForwardHttps) - 1; } //if ( headerLen > 0 ) { pExtraHeader[headerLen++] = '\r'; pExtraHeader[headerLen++] = '\n'; m_iovec.append(pExtraHeader, headerLen); m_iTotalPending += headerLen; } m_iReqHeaderSize = m_iTotalPending; m_iReqBodySize = pReq->getContentFinished(); setInProcess(1); return 1; }