AsyncProxySocketLayer.cpp 34 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101
  1. // CAsyncProxySocketLayer by Tim Kosse ([email protected])
  2. // Version 1.6 (2003-03-26)
  3. //---------------------------------------------------------------------------
  4. // Feel free to use this class, as long as you don't claim that you wrote it
  5. // and this copyright notice stays intact in the source files.
  6. // If you use this class in commercial applications, please send a short message
  7. // to [email protected]
  8. //---------------------------------------------------------------------------
  9. #include "stdafx.h"
  10. #include "AsyncProxySocketLayer.h"
  11. #include "atlconv.h" //Unicode<->Ascii conversion macros declared here
  12. #include <Soap.EncdDecd.hpp>
  13. //////////////////////////////////////////////////////////////////////
  14. // Konstruktion/Destruktion
  15. //////////////////////////////////////////////////////////////////////
  16. CAsyncProxySocketLayer::CAsyncProxySocketLayer()
  17. {
  18. m_nProxyOpID=0;
  19. m_nProxyOpState=0;
  20. m_pRecvBuffer=0;
  21. m_nRecvBufferLen=0;
  22. m_nRecvBufferPos=0;
  23. m_ProxyData.nProxyType=0;
  24. m_nProxyPeerIp=0;
  25. m_nProxyPeerPort=0;
  26. m_pProxyPeerHost = NULL;
  27. m_pStrBuffer = NULL;
  28. m_ProxyData.pProxyHost = NULL;
  29. m_ProxyData.pProxyUser = NULL;
  30. m_ProxyData.pProxyPass = NULL;
  31. m_pProxyPeerHost = NULL;
  32. }
  33. CAsyncProxySocketLayer::~CAsyncProxySocketLayer()
  34. {
  35. delete [] m_ProxyData.pProxyHost;
  36. delete [] m_ProxyData.pProxyUser;
  37. delete [] m_ProxyData.pProxyPass;
  38. delete [] m_pProxyPeerHost;
  39. ClearBuffer();
  40. }
  41. /////////////////////////////////////////////////////////////////////////////
  42. // Member-Funktion CAsyncProxySocketLayer
  43. void CAsyncProxySocketLayer::SetProxy(int nProxyType, const char * pProxyHost, int ProxyPort)
  44. {
  45. USES_CONVERSION;
  46. //Validate the parameters
  47. DebugAssert(nProxyType==PROXYTYPE_SOCKS4 ||
  48. nProxyType==PROXYTYPE_SOCKS4A ||
  49. nProxyType==PROXYTYPE_SOCKS5 ||
  50. nProxyType==PROXYTYPE_HTTP11);
  51. DebugAssert(!m_nProxyOpID);
  52. DebugAssert(pProxyHost && *pProxyHost);
  53. DebugAssert(ProxyPort>0);
  54. DebugAssert(ProxyPort<=65535);
  55. delete m_ProxyData.pProxyHost;
  56. delete m_ProxyData.pProxyUser;
  57. delete m_ProxyData.pProxyPass;
  58. m_ProxyData.pProxyUser = NULL;
  59. m_ProxyData.pProxyPass = NULL;
  60. m_ProxyData.nProxyType = nProxyType;
  61. m_ProxyData.pProxyHost = new char[strlen(pProxyHost)+1];
  62. strcpy(m_ProxyData.pProxyHost, pProxyHost);
  63. m_ProxyData.nProxyPort = ProxyPort;
  64. m_ProxyData.bUseLogon = FALSE;
  65. }
  66. void CAsyncProxySocketLayer::SetProxy(int nProxyType, const char * pProxyHost, int ProxyPort, const char * pProxyUser, const char * pProxyPass)
  67. {
  68. USES_CONVERSION;
  69. //Validate the parameters
  70. DebugAssert(nProxyType==PROXYTYPE_SOCKS5 || nProxyType==PROXYTYPE_HTTP11);
  71. DebugAssert(!m_nProxyOpID);
  72. DebugAssert(pProxyHost && *pProxyHost);
  73. DebugAssert(ProxyPort>0);
  74. DebugAssert(ProxyPort<=65535);
  75. delete m_ProxyData.pProxyHost;
  76. delete m_ProxyData.pProxyUser;
  77. delete m_ProxyData.pProxyPass;
  78. m_ProxyData.pProxyUser = NULL;
  79. m_ProxyData.pProxyPass = NULL;
  80. m_ProxyData.nProxyType = nProxyType;
  81. m_ProxyData.pProxyHost = new char[strlen(pProxyHost)+1];
  82. strcpy(m_ProxyData.pProxyHost, pProxyHost);
  83. m_ProxyData.nProxyPort=ProxyPort;
  84. if (pProxyUser)
  85. {
  86. m_ProxyData.pProxyUser = new char[strlen(pProxyUser)+1];
  87. strcpy(m_ProxyData.pProxyUser, pProxyUser);
  88. }
  89. if (pProxyPass)
  90. {
  91. m_ProxyData.pProxyPass = new char[strlen(pProxyPass)+1];
  92. strcpy(m_ProxyData.pProxyPass, pProxyPass);
  93. }
  94. m_ProxyData.bUseLogon = TRUE;
  95. }
  96. void CAsyncProxySocketLayer::OnReceive(int nErrorCode)
  97. {
  98. //Here we handle the responses from the SOCKS proxy
  99. if (!m_nProxyOpID)
  100. {
  101. TriggerEvent(FD_READ, nErrorCode, TRUE);
  102. return;
  103. }
  104. if (nErrorCode)
  105. {
  106. TriggerEvent(FD_READ, nErrorCode, TRUE);
  107. }
  108. if (!m_nProxyOpState) //We should not receive a response yet!
  109. {
  110. //Ignore it
  111. return;
  112. }
  113. if (m_ProxyData.nProxyType==PROXYTYPE_SOCKS4 || m_ProxyData.nProxyType==PROXYTYPE_SOCKS4A)
  114. {
  115. if (m_nProxyOpState==1) //Both for PROXYOP_CONNECT and PROXYOP_BIND
  116. {
  117. if (!m_pRecvBuffer)
  118. m_pRecvBuffer=new char[8];
  119. int numread=ReceiveNext(m_pRecvBuffer+m_nRecvBufferPos, 8-m_nRecvBufferPos);
  120. if (numread==SOCKET_ERROR)
  121. {
  122. if (WSAGetLastError()!=WSAEWOULDBLOCK)
  123. {
  124. DoLayerCallback(LAYERCALLBACK_LAYERSPECIFIC, PROXYERROR_REQUESTFAILED, 0);
  125. if (m_nProxyOpID==PROXYOP_CONNECT)
  126. TriggerEvent(FD_CONNECT, WSAGetLastError(), TRUE);
  127. else
  128. TriggerEvent(FD_ACCEPT, WSAGetLastError(), TRUE);
  129. Reset();
  130. ClearBuffer();
  131. }
  132. return;
  133. }
  134. m_nRecvBufferPos+=numread;
  135. if (m_nRecvBufferPos==8)
  136. {
  137. if (m_pRecvBuffer[1]!=90 || m_pRecvBuffer[0]!=0)
  138. {
  139. DoLayerCallback(LAYERCALLBACK_LAYERSPECIFIC, PROXYERROR_REQUESTFAILED, 0);
  140. if (m_nProxyOpID==PROXYOP_CONNECT)
  141. TriggerEvent(FD_CONNECT, WSAECONNABORTED, TRUE);
  142. else
  143. TriggerEvent(FD_ACCEPT, WSAECONNABORTED, TRUE);
  144. Reset();
  145. ClearBuffer();
  146. return;
  147. }
  148. if (m_nProxyOpID==PROXYOP_CONNECT)
  149. {
  150. //OK, we are connected with the remote server
  151. ClearBuffer();
  152. Reset();
  153. TriggerEvent(FD_CONNECT, 0, TRUE);
  154. TriggerEvent(FD_READ, 0, TRUE);
  155. TriggerEvent(FD_WRITE, 0, TRUE);
  156. return;
  157. }
  158. else
  159. {
  160. //Listen socket created
  161. m_nProxyOpState++;
  162. unsigned long ip;
  163. int port;
  164. memcpy(&ip,&m_pRecvBuffer[4],4);
  165. if (!ip)
  166. {
  167. //No IP return, use the IP of the proxy server
  168. SOCKADDR SockAddr;
  169. memset(&SockAddr,0,sizeof(SockAddr));
  170. int SockAddrLen=sizeof(SockAddr);
  171. if (GetPeerName(&SockAddr, &SockAddrLen ))
  172. {
  173. ip=((LPSOCKADDR_IN)&SockAddr)->sin_addr.S_un.S_addr;
  174. }
  175. else
  176. {
  177. DoLayerCallback(LAYERCALLBACK_LAYERSPECIFIC, PROXYERROR_REQUESTFAILED, 0);
  178. if (m_nProxyOpID==PROXYOP_CONNECT)
  179. TriggerEvent(FD_CONNECT, WSAECONNABORTED, TRUE);
  180. else
  181. TriggerEvent(FD_ACCEPT, WSAECONNABORTED, TRUE);
  182. Reset();
  183. ClearBuffer();
  184. return;
  185. }
  186. }
  187. memcpy(&port,&m_pRecvBuffer[2],2);
  188. t_ListenSocketCreatedStruct data;
  189. data.ip=ip;
  190. data.nPort=port;
  191. DoLayerCallback(LAYERCALLBACK_LAYERSPECIFIC, PROXYSTATUS_LISTENSOCKETCREATED, (int)&data);
  192. }
  193. ClearBuffer();
  194. }
  195. }
  196. else if (m_nProxyOpID==2)
  197. {
  198. if (!m_pRecvBuffer)
  199. m_pRecvBuffer=new char[8];
  200. int numread=ReceiveNext(m_pRecvBuffer+m_nRecvBufferPos,8-m_nRecvBufferPos);
  201. if (numread==SOCKET_ERROR)
  202. {
  203. if (WSAGetLastError()!=WSAEWOULDBLOCK)
  204. {
  205. DoLayerCallback(LAYERCALLBACK_LAYERSPECIFIC, PROXYERROR_REQUESTFAILED, 0);
  206. if (m_nProxyOpID==PROXYOP_CONNECT)
  207. TriggerEvent(FD_CONNECT, WSAGetLastError(), TRUE);
  208. else
  209. TriggerEvent(FD_ACCEPT, WSAGetLastError(), TRUE);
  210. Reset();
  211. ClearBuffer();
  212. }
  213. return;
  214. }
  215. m_nRecvBufferPos+=numread;
  216. if (m_nRecvBufferPos==8)
  217. {
  218. if (m_pRecvBuffer[1]!=90 || m_pRecvBuffer[0]!=0)
  219. {
  220. DoLayerCallback(LAYERCALLBACK_LAYERSPECIFIC, PROXYERROR_REQUESTFAILED, 0);
  221. if (m_nProxyOpID==PROXYOP_CONNECT)
  222. TriggerEvent(FD_CONNECT, WSAECONNABORTED, TRUE);
  223. else
  224. TriggerEvent(FD_ACCEPT, WSAECONNABORTED, TRUE);
  225. Reset();
  226. ClearBuffer();
  227. return;
  228. }
  229. //Connection to remote server established
  230. ClearBuffer();
  231. Reset();
  232. TriggerEvent(FD_ACCEPT, 0, TRUE);
  233. TriggerEvent(FD_READ, 0, TRUE);
  234. TriggerEvent(FD_WRITE, 0, TRUE);
  235. }
  236. }
  237. }
  238. else if (m_ProxyData.nProxyType==PROXYTYPE_SOCKS5)
  239. {
  240. if (m_nProxyOpState==1) //Get respone to initialization message
  241. {
  242. if (!m_pRecvBuffer)
  243. m_pRecvBuffer=new char[2];
  244. int numread=ReceiveNext(m_pRecvBuffer+m_nRecvBufferPos,2-m_nRecvBufferPos);
  245. if (numread==SOCKET_ERROR)
  246. {
  247. if (WSAGetLastError()!=WSAEWOULDBLOCK)
  248. {
  249. DoLayerCallback(LAYERCALLBACK_LAYERSPECIFIC, PROXYERROR_REQUESTFAILED, 0);
  250. if (m_nProxyOpID==PROXYOP_CONNECT)
  251. TriggerEvent(FD_CONNECT, WSAGetLastError(), TRUE);
  252. else
  253. TriggerEvent(FD_ACCEPT, WSAGetLastError(), TRUE);
  254. Reset();
  255. }
  256. return;
  257. }
  258. m_nRecvBufferPos+=numread;
  259. if (m_nRecvBufferPos==2)
  260. {
  261. if (m_pRecvBuffer[0]!=5)
  262. {
  263. DoLayerCallback(LAYERCALLBACK_LAYERSPECIFIC, PROXYERROR_REQUESTFAILED, 0);
  264. if (m_nProxyOpID==PROXYOP_CONNECT)
  265. TriggerEvent(FD_CONNECT, WSAECONNABORTED, TRUE);
  266. else
  267. TriggerEvent(FD_ACCEPT, WSAECONNABORTED, TRUE);
  268. Reset();
  269. ClearBuffer();
  270. return;
  271. }
  272. if (m_pRecvBuffer[1])
  273. {
  274. //Auth needed
  275. if (m_pRecvBuffer[1]!=2)
  276. {
  277. //Unknown auth type
  278. DoLayerCallback(LAYERCALLBACK_LAYERSPECIFIC, PROXYERROR_AUTHTYPEUNKNOWN, 0);
  279. if (m_nProxyOpID==PROXYOP_CONNECT)
  280. TriggerEvent(FD_CONNECT, WSAECONNABORTED, TRUE);
  281. else
  282. TriggerEvent(FD_ACCEPT, WSAECONNABORTED, TRUE);
  283. Reset();
  284. ClearBuffer();
  285. return;
  286. }
  287. if (!m_ProxyData.bUseLogon)
  288. {
  289. DoLayerCallback(LAYERCALLBACK_LAYERSPECIFIC, PROXYERROR_AUTHNOLOGON, 0);
  290. if (m_nProxyOpID==PROXYOP_CONNECT)
  291. TriggerEvent(FD_CONNECT, WSAECONNABORTED, TRUE);
  292. else
  293. TriggerEvent(FD_ACCEPT, WSAECONNABORTED, TRUE);
  294. Reset();
  295. ClearBuffer();
  296. return;
  297. }
  298. //Send authentication
  299. LPCSTR lpszAsciiUser = m_ProxyData.pProxyUser;
  300. LPCSTR lpszAsciiPass = m_ProxyData.pProxyPass;
  301. DebugAssert(strlen(lpszAsciiUser)<=255);
  302. DebugAssert(strlen(lpszAsciiPass)<=255);
  303. unsigned char *buffer = new unsigned char[3 + (lpszAsciiUser?strlen(lpszAsciiUser):0) + (lpszAsciiPass?strlen(lpszAsciiPass):0) + 1];
  304. sprintf((char *)buffer, " %s %s", lpszAsciiUser?lpszAsciiUser:"", lpszAsciiPass?lpszAsciiPass:"");
  305. buffer[0]=1;
  306. buffer[1]=static_cast<unsigned char>(strlen(lpszAsciiUser));
  307. buffer[2+strlen(lpszAsciiUser)]=static_cast<unsigned char>(strlen(lpszAsciiPass));
  308. int len=3+strlen(lpszAsciiUser)+strlen(lpszAsciiPass);
  309. int res=SendNext(buffer,len);
  310. delete [] buffer;
  311. if (res==SOCKET_ERROR || res<len)
  312. {
  313. if ((WSAGetLastError()!=WSAEWOULDBLOCK) || res<len)
  314. {
  315. DoLayerCallback(LAYERCALLBACK_LAYERSPECIFIC, PROXYERROR_REQUESTFAILED, 0);
  316. if (m_nProxyOpID==PROXYOP_CONNECT)
  317. TriggerEvent(FD_CONNECT, WSAGetLastError(), TRUE);
  318. else
  319. TriggerEvent(FD_ACCEPT, WSAGetLastError(), TRUE);
  320. Reset();
  321. return;
  322. }
  323. }
  324. ClearBuffer();
  325. m_nProxyOpState++;
  326. return;
  327. }
  328. }
  329. //No auth needed
  330. //Send connection request
  331. const char *lpszAsciiHost = m_pProxyPeerHost?m_pProxyPeerHost:"";
  332. char *command=new char[10+strlen(lpszAsciiHost)+1];
  333. memset(command,0,10+strlen(lpszAsciiHost)+1);
  334. command[0]=5;
  335. command[1]=(m_nProxyOpID==PROXYOP_CONNECT)?1:2;
  336. command[2]=0;
  337. command[3]=m_nProxyPeerIp?1:3;
  338. int len=4;
  339. if (m_nProxyPeerIp)
  340. {
  341. memcpy(&command[len],&m_nProxyPeerIp,4);
  342. len+=4;
  343. }
  344. else
  345. {
  346. command[len]=strlen(lpszAsciiHost);
  347. strcpy(&command[len+1], lpszAsciiHost);
  348. len += strlen(lpszAsciiHost) + 1;
  349. }
  350. memcpy(&command[len], &m_nProxyPeerPort, 2);
  351. len+=2;
  352. int res=SendNext(command,len);
  353. delete [] command;
  354. if (res==SOCKET_ERROR || res<len)
  355. {
  356. if ( ( WSAGetLastError()!=WSAEWOULDBLOCK) || res<len)
  357. {
  358. DoLayerCallback(LAYERCALLBACK_LAYERSPECIFIC, PROXYERROR_REQUESTFAILED, 0);
  359. if (m_nProxyOpID==PROXYOP_CONNECT)
  360. TriggerEvent(FD_CONNECT, WSAGetLastError(), TRUE);
  361. else
  362. TriggerEvent(FD_ACCEPT, WSAGetLastError(), TRUE);
  363. Reset();
  364. return;
  365. }
  366. }
  367. m_nProxyOpState+=2;
  368. ClearBuffer();
  369. return;
  370. }
  371. else if (m_nProxyOpState==2)
  372. {
  373. //Response to the auth request
  374. if (!m_pRecvBuffer)
  375. m_pRecvBuffer=new char[2];
  376. int numread=ReceiveNext(m_pRecvBuffer+m_nRecvBufferPos, 2-m_nRecvBufferPos);
  377. if (numread==SOCKET_ERROR)
  378. {
  379. if (WSAGetLastError()!=WSAEWOULDBLOCK)
  380. {
  381. DoLayerCallback(LAYERCALLBACK_LAYERSPECIFIC, PROXYERROR_REQUESTFAILED, 0);
  382. if (m_nProxyOpID==PROXYOP_CONNECT)
  383. TriggerEvent(FD_CONNECT, WSAGetLastError(), TRUE);
  384. else
  385. TriggerEvent(FD_ACCEPT, WSAGetLastError(), TRUE);
  386. Reset();
  387. }
  388. return;
  389. }
  390. m_nRecvBufferPos+=numread;
  391. if (m_nRecvBufferPos==2)
  392. {
  393. if (m_pRecvBuffer[1]!=0)
  394. {
  395. DoLayerCallback(LAYERCALLBACK_LAYERSPECIFIC, PROXYERROR_AUTHFAILED, 0);
  396. if (m_nProxyOpID==PROXYOP_CONNECT)
  397. TriggerEvent(FD_CONNECT, WSAECONNABORTED, TRUE);
  398. else
  399. TriggerEvent(FD_ACCEPT, WSAECONNABORTED, TRUE);
  400. Reset();
  401. ClearBuffer();
  402. return;
  403. }
  404. const char * lpszAsciiHost = m_pProxyPeerHost?m_pProxyPeerHost:"";
  405. char *command = new char[10+strlen(lpszAsciiHost)+1];
  406. memset(command,0,10+strlen(lpszAsciiHost)+1);
  407. command[0]=5;
  408. command[1]=(m_nProxyOpID==PROXYOP_CONNECT)?1:2;
  409. command[2]=0;
  410. command[3]=m_nProxyPeerIp?1:3;
  411. int len=4;
  412. if (m_nProxyPeerIp)
  413. {
  414. memcpy(&command[len],&m_nProxyPeerIp,4);
  415. len+=4;
  416. }
  417. else
  418. {
  419. command[len]=strlen(lpszAsciiHost);
  420. strcpy(&command[len+1],lpszAsciiHost);
  421. len+=strlen(lpszAsciiHost)+1;
  422. }
  423. memcpy(&command[len],&m_nProxyPeerPort,2);
  424. len+=2;
  425. int res=SendNext(command,len);
  426. delete [] command;
  427. if (res==SOCKET_ERROR || res<len)
  428. {
  429. if ((WSAGetLastError()!=WSAEWOULDBLOCK) || res<len)
  430. {
  431. DoLayerCallback(LAYERCALLBACK_LAYERSPECIFIC, PROXYERROR_REQUESTFAILED, 0);
  432. if (m_nProxyOpID==PROXYOP_CONNECT)
  433. TriggerEvent(FD_CONNECT, WSAGetLastError(), TRUE);
  434. else
  435. TriggerEvent(FD_ACCEPT, WSAGetLastError(), TRUE);
  436. Reset();
  437. return;
  438. }
  439. }
  440. m_nProxyOpState++;
  441. ClearBuffer();
  442. return;
  443. }
  444. }
  445. else if (m_nProxyOpState==3)
  446. {
  447. //Response to the connection request
  448. if (!m_pRecvBuffer)
  449. {
  450. m_pRecvBuffer=new char[10];
  451. m_nRecvBufferLen=5;
  452. }
  453. int numread=ReceiveNext(m_pRecvBuffer+m_nRecvBufferPos,m_nRecvBufferLen-m_nRecvBufferPos);
  454. if (numread==SOCKET_ERROR)
  455. {
  456. if (WSAGetLastError()!=WSAEWOULDBLOCK)
  457. {
  458. DoLayerCallback(LAYERCALLBACK_LAYERSPECIFIC, PROXYERROR_REQUESTFAILED, 0);
  459. if (m_nProxyOpID==PROXYOP_CONNECT)
  460. TriggerEvent(FD_CONNECT, WSAGetLastError(), TRUE);
  461. else
  462. TriggerEvent(FD_ACCEPT, WSAGetLastError(), TRUE);
  463. Reset();
  464. }
  465. return;
  466. }
  467. m_nRecvBufferPos+=numread;
  468. if (m_nRecvBufferPos==m_nRecvBufferLen)
  469. {
  470. //Check for errors
  471. if (m_pRecvBuffer[1]!=0 || m_pRecvBuffer[0]!=5)
  472. {
  473. DoLayerCallback(LAYERCALLBACK_LAYERSPECIFIC, PROXYERROR_REQUESTFAILED, 0);
  474. if (m_nProxyOpID==PROXYOP_CONNECT)
  475. TriggerEvent(FD_CONNECT, WSAECONNABORTED, TRUE);
  476. else
  477. TriggerEvent(FD_ACCEPT, WSAECONNABORTED, TRUE);
  478. Reset();
  479. ClearBuffer();
  480. return;
  481. }
  482. if (m_nRecvBufferLen==5)
  483. {
  484. //Check which kind of address the response contains
  485. if (m_pRecvBuffer[3]==1)
  486. m_nRecvBufferLen=10;
  487. else
  488. {
  489. char *tmp=new char[m_nRecvBufferLen+=m_pRecvBuffer[4]+2];
  490. memcpy(tmp,m_pRecvBuffer,5);
  491. delete [] m_pRecvBuffer;
  492. m_pRecvBuffer=tmp;
  493. m_nRecvBufferLen+=m_pRecvBuffer[4]+2;
  494. }
  495. return;
  496. }
  497. if (m_nProxyOpID==PROXYOP_CONNECT)
  498. {
  499. //OK, we are connected with the remote server
  500. Reset();
  501. ClearBuffer();
  502. TriggerEvent(FD_CONNECT, 0, TRUE);
  503. TriggerEvent(FD_READ, 0, TRUE);
  504. TriggerEvent(FD_WRITE, 0, TRUE);
  505. }
  506. else
  507. {
  508. //Listen socket created
  509. m_nProxyOpState++;
  510. unsigned long ip;
  511. unsigned short port;
  512. DebugAssert(m_pRecvBuffer[3]==1);
  513. memcpy(&ip, &m_pRecvBuffer[4], 4);
  514. memcpy(&port, &m_pRecvBuffer[8], 2);
  515. t_ListenSocketCreatedStruct data;
  516. data.ip=ip;
  517. data.nPort=port;
  518. DoLayerCallback(LAYERCALLBACK_LAYERSPECIFIC, PROXYSTATUS_LISTENSOCKETCREATED, (int)&data);
  519. }
  520. ClearBuffer();
  521. }
  522. }
  523. else if (m_nProxyOpState==4)
  524. {
  525. if (!m_pRecvBuffer)
  526. m_pRecvBuffer=new char[10];
  527. int numread=ReceiveNext(m_pRecvBuffer+m_nRecvBufferPos,10-m_nRecvBufferPos);
  528. if (numread==SOCKET_ERROR)
  529. {
  530. if (WSAGetLastError()!=WSAEWOULDBLOCK)
  531. {
  532. DoLayerCallback(LAYERCALLBACK_LAYERSPECIFIC, PROXYERROR_REQUESTFAILED, 0);
  533. if (m_nProxyOpID==PROXYOP_CONNECT)
  534. TriggerEvent(FD_CONNECT, WSAGetLastError(), TRUE);
  535. else
  536. TriggerEvent(FD_ACCEPT, WSAGetLastError(), TRUE);
  537. Reset();
  538. }
  539. return;
  540. }
  541. m_nRecvBufferPos+=numread;
  542. if (m_nRecvBufferPos==10)
  543. {
  544. if (m_pRecvBuffer[1]!=0)
  545. {
  546. DoLayerCallback(LAYERCALLBACK_LAYERSPECIFIC, PROXYERROR_REQUESTFAILED, 0);
  547. if (m_nProxyOpID==PROXYOP_CONNECT)
  548. TriggerEvent(FD_CONNECT, WSAECONNABORTED, TRUE);
  549. else
  550. {
  551. DebugCheck(m_nProxyOpID == PROXYOP_LISTEN);
  552. TriggerEvent(FD_ACCEPT, WSAECONNABORTED, TRUE);
  553. }
  554. Reset();
  555. ClearBuffer();
  556. return;
  557. }
  558. //Connection to remote server established
  559. ClearBuffer();
  560. Reset();
  561. TriggerEvent(FD_ACCEPT, 0, TRUE);
  562. TriggerEvent(FD_READ, 0, TRUE);
  563. TriggerEvent(FD_WRITE, 0, TRUE);
  564. }
  565. }
  566. }
  567. if (m_ProxyData.nProxyType==PROXYTYPE_HTTP11)
  568. {
  569. DebugAssert(m_nProxyOpID==PROXYOP_CONNECT);
  570. char buffer[9]={0};
  571. for(;;)
  572. {
  573. int numread = ReceiveNext(buffer, m_pStrBuffer?1:8);
  574. if (numread==SOCKET_ERROR)
  575. {
  576. int nError=WSAGetLastError();
  577. if (nError!=WSAEWOULDBLOCK)
  578. {
  579. DoLayerCallback(LAYERCALLBACK_LAYERSPECIFIC, PROXYERROR_REQUESTFAILED, 0);
  580. Reset();
  581. ClearBuffer();
  582. TriggerEvent(FD_CONNECT, nError, TRUE );
  583. }
  584. return;
  585. }
  586. //Response begins with HTTP/
  587. if (!m_pStrBuffer)
  588. {
  589. m_pStrBuffer = new char[strlen(buffer) + 1];
  590. strcpy(m_pStrBuffer, buffer);
  591. }
  592. else
  593. {
  594. char *tmp = m_pStrBuffer;
  595. m_pStrBuffer = new char[strlen(tmp) + strlen(buffer) + 1];
  596. strcpy(m_pStrBuffer, tmp);
  597. strcpy(m_pStrBuffer + strlen(tmp), buffer);
  598. delete [] tmp;
  599. }
  600. memset(buffer, 0, 9);
  601. const char start[] = "HTTP/";
  602. if (memcmp(start, m_pStrBuffer, (strlen(start)>strlen(m_pStrBuffer)) ? strlen(m_pStrBuffer) : strlen(start)))
  603. {
  604. char* str = new char[strlen("No valid HTTP response") + 1];
  605. strcpy(str, "No valid HTTP response");
  606. DoLayerCallback(LAYERCALLBACK_LAYERSPECIFIC, PROXYERROR_REQUESTFAILED, 0, str);
  607. Reset();
  608. ClearBuffer();
  609. TriggerEvent(FD_CONNECT, WSAECONNABORTED, TRUE );
  610. return;
  611. }
  612. char *pos = strstr(m_pStrBuffer, "\r\n");
  613. if (pos)
  614. {
  615. char *pos2 = strstr(m_pStrBuffer, " ");
  616. if (!pos2 || *(pos2+1)!='2' || pos2>pos)
  617. {
  618. char *tmp = new char[pos-m_pStrBuffer + 1];
  619. tmp[pos-m_pStrBuffer] = 0;
  620. strncpy(tmp, m_pStrBuffer, pos-m_pStrBuffer);
  621. DoLayerCallback(LAYERCALLBACK_LAYERSPECIFIC, PROXYERROR_REQUESTFAILED, 0, tmp);
  622. Reset();
  623. ClearBuffer();
  624. TriggerEvent(FD_CONNECT, WSAECONNABORTED, TRUE );
  625. return;
  626. }
  627. }
  628. if (strlen(m_pStrBuffer)>3 && !memcmp(m_pStrBuffer+strlen(m_pStrBuffer)-4, "\r\n\r\n", 4)) //End of the HTTP header
  629. {
  630. Reset();
  631. ClearBuffer();
  632. TriggerEvent(FD_CONNECT, 0, TRUE);
  633. TriggerEvent(FD_READ, 0, TRUE);
  634. TriggerEvent(FD_WRITE, 0, TRUE);
  635. return;
  636. }
  637. }
  638. }
  639. }
  640. BOOL CAsyncProxySocketLayer::Connect( LPCTSTR lpszHostAddress, UINT nHostPort )
  641. {
  642. if (!m_ProxyData.nProxyType)
  643. //Connect normally because there is no proxy
  644. return ConnectNext(lpszHostAddress, nHostPort);
  645. USES_CONVERSION;
  646. //Translate the host address
  647. DebugAssert(lpszHostAddress != NULL);
  648. if (m_ProxyData.nProxyType != PROXYTYPE_SOCKS4)
  649. {
  650. // We can send hostname to proxy, no need to resolve it
  651. //Connect to proxy server
  652. BOOL res = ConnectNext(A2CT(m_ProxyData.pProxyHost), m_ProxyData.nProxyPort);
  653. if (!res)
  654. {
  655. if (WSAGetLastError() != WSAEWOULDBLOCK)
  656. {
  657. DoLayerCallback(LAYERCALLBACK_LAYERSPECIFIC, PROXYERROR_NOCONN, 0);
  658. return FALSE;
  659. }
  660. }
  661. m_nProxyPeerPort = htons((u_short)nHostPort);
  662. m_nProxyPeerIp = 0;
  663. delete [] m_pProxyPeerHost;
  664. m_pProxyPeerHost = new char[_tcslen(lpszHostAddress)+1];
  665. strcpy(m_pProxyPeerHost, T2CA(lpszHostAddress));
  666. m_nProxyOpID=PROXYOP_CONNECT;
  667. return TRUE;
  668. }
  669. SOCKADDR_IN sockAddr;
  670. memset(&sockAddr,0,sizeof(sockAddr));
  671. LPCSTR lpszAscii = T2A((LPTSTR)lpszHostAddress);
  672. sockAddr.sin_family = AF_INET;
  673. sockAddr.sin_addr.s_addr = inet_addr(lpszAscii);
  674. if (sockAddr.sin_addr.s_addr == INADDR_NONE)
  675. {
  676. LPHOSTENT lphost;
  677. lphost = gethostbyname(lpszAscii);
  678. if (lphost != NULL)
  679. sockAddr.sin_addr.s_addr = ((LPIN_ADDR)lphost->h_addr)->s_addr;
  680. else
  681. {
  682. //Can't resolve hostname
  683. DoLayerCallback(LAYERCALLBACK_LAYERSPECIFIC, PROXYERROR_CANTRESOLVEHOST, 0);
  684. WSASetLastError(WSAEINVAL);
  685. return FALSE;
  686. }
  687. }
  688. sockAddr.sin_port = htons((u_short)nHostPort);
  689. BOOL res=CAsyncProxySocketLayer::Connect((SOCKADDR*)&sockAddr, sizeof(sockAddr));
  690. if (res || WSAGetLastError()==WSAEWOULDBLOCK)
  691. {
  692. delete [] m_pProxyPeerHost;
  693. m_pProxyPeerHost = new char[strlen(T2CA(lpszHostAddress))+1];
  694. strcpy(m_pProxyPeerHost, T2CA(lpszHostAddress));
  695. }
  696. return res;
  697. }
  698. BOOL CAsyncProxySocketLayer::Connect( const SOCKADDR* lpSockAddr, int nSockAddrLen )
  699. {
  700. if (!m_ProxyData.nProxyType)
  701. {
  702. //Connect normally because there is no proxy
  703. return ConnectNext(lpSockAddr, nSockAddrLen );
  704. }
  705. LPSOCKADDR_IN sockAddr=(LPSOCKADDR_IN)lpSockAddr;
  706. //Save server details
  707. m_nProxyPeerIp=sockAddr->sin_addr.S_un.S_addr;
  708. m_nProxyPeerPort=sockAddr->sin_port;
  709. delete [] m_pProxyPeerHost;
  710. m_pProxyPeerHost = NULL;
  711. m_nProxyOpID=PROXYOP_CONNECT;
  712. USES_CONVERSION;
  713. BOOL res = ConnectNext(A2T(m_ProxyData.pProxyHost), m_ProxyData.nProxyPort);
  714. if (!res)
  715. {
  716. if (WSAGetLastError()!=WSAEWOULDBLOCK)
  717. {
  718. DoLayerCallback(LAYERCALLBACK_LAYERSPECIFIC, PROXYERROR_NOCONN, 0);
  719. return FALSE;
  720. }
  721. }
  722. return res;
  723. }
  724. void CAsyncProxySocketLayer::OnConnect(int nErrorCode)
  725. {
  726. if (m_ProxyData.nProxyType==PROXYTYPE_NOPROXY)
  727. {
  728. TriggerEvent(FD_CONNECT, nErrorCode, TRUE);
  729. return;
  730. }
  731. DebugAssert(m_nProxyOpID);
  732. if (!m_nProxyOpID)
  733. {
  734. //This should not happen
  735. return;
  736. };
  737. if (nErrorCode)
  738. { //Can't connect to proxy
  739. DoLayerCallback(LAYERCALLBACK_LAYERSPECIFIC, PROXYERROR_NOCONN, 0);
  740. if (m_nProxyOpID==PROXYOP_CONNECT)
  741. TriggerEvent(FD_CONNECT, nErrorCode, TRUE);
  742. else
  743. TriggerEvent(FD_ACCEPT, nErrorCode, TRUE);
  744. Reset();
  745. ClearBuffer();
  746. return;
  747. }
  748. if (m_nProxyOpID==PROXYOP_CONNECT || m_nProxyOpID==PROXYOP_LISTEN)
  749. {
  750. if (m_nProxyOpState)
  751. //Somehow OnConnect has been called more than once
  752. return;
  753. DebugAssert(m_ProxyData.nProxyType!=PROXYTYPE_NOPROXY);
  754. ClearBuffer();
  755. DoLayerCallback(LAYERCALLBACK_LAYERSPECIFIC, PROXYERROR_NOERROR, 0);
  756. //Send the initial request
  757. if (m_ProxyData.nProxyType==PROXYTYPE_SOCKS4 || m_ProxyData.nProxyType==PROXYTYPE_SOCKS4A)
  758. { //SOCKS4 proxy
  759. //Send request
  760. LPCSTR lpszAscii = m_pProxyPeerHost?m_pProxyPeerHost:"";
  761. char *command=new char [9+strlen(lpszAscii)+1];
  762. memset(command,0,9+strlen(lpszAscii)+1);
  763. int len=9;
  764. command[0]=4;
  765. command[1]=(m_nProxyOpID==PROXYOP_CONNECT)?1:2; //CONNECT or BIND request
  766. memcpy(&command[2],&m_nProxyPeerPort,2); //Copy target address
  767. if (!m_nProxyPeerIp || m_ProxyData.nProxyType==PROXYTYPE_SOCKS4A)
  768. {
  769. DebugAssert(m_ProxyData.nProxyType==PROXYTYPE_SOCKS4A);
  770. DebugAssert(strcmp(lpszAscii, ""));
  771. //Set the IP to 0.0.0.x (x is nonzero)
  772. command[4]=0;
  773. command[5]=0;
  774. command[6]=0;
  775. command[7]=1;
  776. //Add host as URL
  777. strcpy(&command[9],lpszAscii);
  778. len+=strlen(lpszAscii)+1;
  779. }
  780. else
  781. memcpy(&command[4],&m_nProxyPeerIp,4);
  782. int res=SendNext(command,len); //Send command
  783. delete [] command;
  784. int nErrorCode=WSAGetLastError();
  785. if (res==SOCKET_ERROR)//nErrorCode!=WSAEWOULDBLOCK)
  786. {
  787. DoLayerCallback(LAYERCALLBACK_LAYERSPECIFIC, PROXYERROR_REQUESTFAILED, 0);
  788. if (m_nProxyOpID==PROXYOP_CONNECT)
  789. TriggerEvent(FD_CONNECT, (nErrorCode==WSAEWOULDBLOCK)?WSAECONNABORTED:nErrorCode, TRUE);
  790. else
  791. TriggerEvent(FD_ACCEPT, nErrorCode, TRUE);
  792. Reset();
  793. ClearBuffer();
  794. return;
  795. }
  796. else if (res<len)
  797. {
  798. DoLayerCallback(LAYERCALLBACK_LAYERSPECIFIC, PROXYERROR_REQUESTFAILED, 0);
  799. if (m_nProxyOpID==PROXYOP_CONNECT)
  800. TriggerEvent(FD_CONNECT, WSAECONNABORTED, TRUE);
  801. else
  802. TriggerEvent(FD_ACCEPT, WSAECONNABORTED, TRUE);
  803. Reset();
  804. ClearBuffer();
  805. return;
  806. }
  807. }
  808. else if (m_ProxyData.nProxyType==PROXYTYPE_SOCKS5)
  809. { //SOCKS5 proxy
  810. //Send initialization request
  811. unsigned char command[10];
  812. memset(command,0,10);
  813. command[0]=5;
  814. //CAsyncProxySocketLayer supports to logon types: No logon and
  815. //cleartext username/password (if set) logon
  816. command[1]=m_ProxyData.bUseLogon?2:1; //Number of logon types
  817. command[2]=m_ProxyData.bUseLogon?2:0; //2=user/pass, 0=no logon
  818. int len=m_ProxyData.bUseLogon?4:3; //length of request
  819. int res=SendNext(command,len);
  820. int nErrorCode=WSAGetLastError();
  821. if (res==SOCKET_ERROR)//nErrorCode!=WSAEWOULDBLOCK)
  822. {
  823. DoLayerCallback(LAYERCALLBACK_LAYERSPECIFIC, PROXYERROR_REQUESTFAILED, 0);
  824. if (m_nProxyOpID==PROXYOP_CONNECT)
  825. TriggerEvent(FD_CONNECT, (nErrorCode==WSAEWOULDBLOCK)?WSAECONNABORTED:nErrorCode, TRUE);
  826. else
  827. TriggerEvent(FD_ACCEPT, nErrorCode, TRUE);
  828. Reset();
  829. ClearBuffer();
  830. return;
  831. }
  832. else if (res<len)
  833. {
  834. DoLayerCallback(LAYERCALLBACK_LAYERSPECIFIC, PROXYERROR_REQUESTFAILED, 0);
  835. if (m_nProxyOpID==PROXYOP_CONNECT)
  836. TriggerEvent(FD_CONNECT, WSAECONNABORTED, TRUE);
  837. else
  838. TriggerEvent(FD_ACCEPT, WSAECONNABORTED, TRUE);
  839. Reset();
  840. ClearBuffer();
  841. return;
  842. }
  843. }
  844. else if (m_ProxyData.nProxyType==PROXYTYPE_HTTP11)
  845. {
  846. char str[4096]; //This should be large enough
  847. char * pHost = NULL;
  848. if (m_pProxyPeerHost && *m_pProxyPeerHost)
  849. {
  850. pHost = new char[strlen(m_pProxyPeerHost)+1];
  851. strcpy(pHost, m_pProxyPeerHost);
  852. }
  853. else
  854. {
  855. pHost = new char[16];
  856. sprintf(pHost, "%d.%d.%d.%d", m_nProxyPeerIp%256, (m_nProxyPeerIp>>8) % 256, (m_nProxyPeerIp>>16) %256, m_nProxyPeerIp>>24);
  857. }
  858. if (!m_ProxyData.bUseLogon)
  859. sprintf(str, "CONNECT %s:%d HTTP/1.1\r\nHost: %s:%d\r\n\r\n", pHost, ntohs(m_nProxyPeerPort),
  860. pHost, ntohs(m_nProxyPeerPort));
  861. else
  862. {
  863. sprintf(str, "CONNECT %s:%d HTTP/1.1\r\nHost: %s:%d\r\n", pHost, ntohs(m_nProxyPeerPort),
  864. pHost, ntohs(m_nProxyPeerPort));
  865. char userpass[4096];
  866. sprintf(userpass, "%s:%s", m_ProxyData.pProxyUser?m_ProxyData.pProxyUser:"", m_ProxyData.pProxyPass?m_ProxyData.pProxyPass:"");
  867. AnsiString base64str = EncodeBase64(userpass, strlen(userpass));
  868. strcat(str, "Authorization: Basic ");
  869. strcat(str, base64str.c_str());
  870. strcat(str, "\r\nProxy-Authorization: Basic ");
  871. strcat(str, base64str.c_str());
  872. strcat(str, "\r\n\r\n");
  873. }
  874. delete [] pHost;
  875. USES_CONVERSION;
  876. int numsent=SendNext(str, strlen(str) );
  877. int nErrorCode=WSAGetLastError();
  878. if (numsent==SOCKET_ERROR)//nErrorCode!=WSAEWOULDBLOCK)
  879. {
  880. DoLayerCallback(LAYERCALLBACK_LAYERSPECIFIC, PROXYERROR_REQUESTFAILED, 0);
  881. if (m_nProxyOpID==PROXYOP_CONNECT)
  882. TriggerEvent(FD_CONNECT, (nErrorCode==WSAEWOULDBLOCK)?WSAECONNABORTED:nErrorCode, TRUE);
  883. else
  884. TriggerEvent(FD_ACCEPT, nErrorCode, TRUE);
  885. Reset();
  886. ClearBuffer();
  887. return;
  888. }
  889. else if ( numsent < static_cast<int>( strlen(str) ) )
  890. {
  891. DoLayerCallback(LAYERCALLBACK_LAYERSPECIFIC, PROXYERROR_REQUESTFAILED, 0);
  892. if (m_nProxyOpID==PROXYOP_CONNECT)
  893. TriggerEvent(FD_CONNECT, WSAECONNABORTED, TRUE);
  894. else
  895. TriggerEvent(FD_ACCEPT, WSAECONNABORTED, TRUE);
  896. Reset();
  897. ClearBuffer();
  898. return;
  899. }
  900. m_nProxyOpState++;
  901. return;
  902. }
  903. else
  904. DebugFail();
  905. //Now we'll wait for the response, handled in OnReceive
  906. m_nProxyOpState++;
  907. }
  908. }
  909. void CAsyncProxySocketLayer::ClearBuffer()
  910. {
  911. delete [] m_pStrBuffer;
  912. m_pStrBuffer = NULL;
  913. if (m_pRecvBuffer)
  914. {
  915. delete [] m_pRecvBuffer;
  916. m_pRecvBuffer=0;
  917. }
  918. m_nRecvBufferLen=0;
  919. m_nRecvBufferPos=0;
  920. }
  921. BOOL CAsyncProxySocketLayer::Listen( int nConnectionBacklog)
  922. {
  923. if (m_ProxyData.nProxyType==PROXYTYPE_NOPROXY)
  924. return ListenNext(nConnectionBacklog);
  925. USES_CONVERSION;
  926. //Connect to proxy server
  927. BOOL res = ConnectNext(A2T(m_ProxyData.pProxyHost), m_ProxyData.nProxyPort);
  928. if (!res)
  929. {
  930. if (WSAGetLastError()!=WSAEWOULDBLOCK)
  931. {
  932. DoLayerCallback(LAYERCALLBACK_LAYERSPECIFIC, PROXYERROR_NOCONN, 0);
  933. return FALSE;
  934. }
  935. }
  936. m_nProxyPeerPort=0;
  937. m_nProxyPeerIp=(unsigned int)nConnectionBacklog;
  938. m_nProxyOpID=PROXYOP_LISTEN;
  939. return TRUE;
  940. }
  941. BOOL CAsyncProxySocketLayer::GetPeerName(CString &rPeerAddress, UINT &rPeerPort)
  942. {
  943. if (m_ProxyData.nProxyType==PROXYTYPE_NOPROXY)
  944. {
  945. return GetPeerNameNext(rPeerAddress, rPeerPort);
  946. }
  947. if (GetLayerState()==notsock)
  948. {
  949. WSASetLastError(WSAENOTSOCK);
  950. return FALSE;
  951. }
  952. else if (GetLayerState()!=connected)
  953. {
  954. WSASetLastError(WSAENOTCONN);
  955. return FALSE;
  956. }
  957. else if (!m_nProxyPeerIp || !m_nProxyPeerPort)
  958. {
  959. WSASetLastError(WSAENOTCONN);
  960. return FALSE;
  961. }
  962. DebugAssert(m_ProxyData.nProxyType);
  963. BOOL res=GetPeerNameNext( rPeerAddress, rPeerPort );
  964. if (res)
  965. {
  966. rPeerPort=ntohs(m_nProxyPeerPort);
  967. rPeerAddress.Format(L"%d.%d.%d.%d", m_nProxyPeerIp%256,(m_nProxyPeerIp>>8)%256,(m_nProxyPeerIp>>16)%256, m_nProxyPeerIp>>24);
  968. }
  969. return res;
  970. }
  971. BOOL CAsyncProxySocketLayer::GetPeerName( SOCKADDR* lpSockAddr, int* lpSockAddrLen )
  972. {
  973. if (m_ProxyData.nProxyType==PROXYTYPE_NOPROXY)
  974. {
  975. return GetPeerNameNext(lpSockAddr, lpSockAddrLen);
  976. }
  977. if (GetLayerState()==notsock)
  978. {
  979. WSASetLastError(WSAENOTSOCK);
  980. return FALSE;
  981. }
  982. else if (GetLayerState()!=connected)
  983. {
  984. WSASetLastError(WSAENOTCONN);
  985. return FALSE;
  986. }
  987. else if (!m_nProxyPeerIp || !m_nProxyPeerPort)
  988. {
  989. WSASetLastError(WSAENOTCONN);
  990. return FALSE;
  991. }
  992. DebugAssert(m_ProxyData.nProxyType);
  993. BOOL res=GetPeerNameNext(lpSockAddr,lpSockAddrLen);
  994. if (res)
  995. {
  996. LPSOCKADDR_IN addr=(LPSOCKADDR_IN)lpSockAddr;
  997. addr->sin_port=m_nProxyPeerPort;
  998. addr->sin_addr.S_un.S_addr=m_nProxyPeerIp;
  999. }
  1000. return res;
  1001. }
  1002. void CAsyncProxySocketLayer::Close()
  1003. {
  1004. delete [] m_ProxyData.pProxyHost;
  1005. delete [] m_ProxyData.pProxyUser;
  1006. delete [] m_ProxyData.pProxyPass;
  1007. delete [] m_pProxyPeerHost;
  1008. m_ProxyData.pProxyHost = NULL;
  1009. m_ProxyData.pProxyUser = NULL;
  1010. m_ProxyData.pProxyPass = NULL;
  1011. m_pProxyPeerHost = NULL;
  1012. ClearBuffer();
  1013. Reset();
  1014. CloseNext();
  1015. }
  1016. void CAsyncProxySocketLayer::Reset()
  1017. {
  1018. m_nProxyOpState=0;
  1019. m_nProxyOpID=0;
  1020. }
  1021. int CAsyncProxySocketLayer::Send(const void* lpBuf, int nBufLen, int nFlags)
  1022. {
  1023. if (m_nProxyOpID)
  1024. {
  1025. WSASetLastError(WSAEWOULDBLOCK);
  1026. return SOCKET_ERROR;
  1027. }
  1028. return SendNext(lpBuf, nBufLen, nFlags);
  1029. }
  1030. int CAsyncProxySocketLayer::Receive(void* lpBuf, int nBufLen, int nFlags)
  1031. {
  1032. if (m_nProxyOpID)
  1033. {
  1034. WSASetLastError(WSAEWOULDBLOCK);
  1035. return SOCKET_ERROR;
  1036. }
  1037. return ReceiveNext(lpBuf, nBufLen, nFlags);
  1038. }
  1039. BOOL CAsyncProxySocketLayer::Accept( CAsyncSocketEx& rConnectedSocket, SOCKADDR* lpSockAddr /*=NULL*/, int* lpSockAddrLen /*=NULL*/ )
  1040. {
  1041. if (!m_ProxyData.nProxyType)
  1042. return AcceptNext(rConnectedSocket, lpSockAddr, lpSockAddrLen);
  1043. GetPeerName(lpSockAddr, lpSockAddrLen);
  1044. return TRUE;
  1045. }