AsyncProxySocketLayer.cpp 35 KB

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