source: cheroxy/trunk/src/CRXProxy.cpp@ 23

Last change on this file since 23 was 23, checked in by cheese, 13 years ago

#1 use _beginthreadex

File size: 4.0 KB
Line 
1/**
2 * CRXProxy.cpp
3 */
4
5#include "CRXSocket.h"
6#include "CRXHttpRequest.h"
7#include "CRXHttpResponse.h"
8
9#include "CRXProxy.h"
10
11#include <string.h>
12
13#ifdef _DEBUG
14# include <iostream>
15using namespace std;
16# define PRINT_ERROR cerr
17#else
18# define PRINT_ERROR
19#endif
20
21#ifdef _WIN32
22# include <process.h>
23# define THREAD_TYPE void *
24# define THREAD_FUNCTION_RETURN unsigned int
25# define THREAD_FUNCTION_CALLING_CONVENTION WINAPI
26#else
27# define THREAD_TYPE pthread_t
28# define THREAD_FUNCTION_RETURN void *
29# define THREAD_FUNCTION_CALLING_CONVENTION
30#endif
31
32THREAD_FUNCTION_RETURN
33THREAD_FUNCTION_CALLING_CONVENTION
34CRXProxyWrapper (void * aThreadArg)
35{
36 int aResult = 0;
37 CRXProxy * aProxy = (CRXProxy *) aThreadArg;
38
39 aResult = aProxy->Forward ();
40 if (aResult)
41 PRINT_ERROR << aProxy->GetErrorMessage ();
42
43 delete aProxy;
44 return (THREAD_FUNCTION_RETURN)0;
45}
46
47CRXProxy::CRXProxy (const int aSocket)
48{
49 /*----------------------------------------------------------------*/
50 mClient = aSocket;
51 /*----------------------------------------------------------------*/
52}
53
54CRXProxy *
55CRXProxy::GetNewInstance(const int aSocket)
56{
57 return new(std::nothrow) CRXProxy (aSocket);
58}
59
60int
61CRXProxy::ForwardMT (void)
62{
63 THREAD_TYPE aThreadID = (THREAD_TYPE)0;
64 /*----------------------------------------------------------------*/
65#ifdef _WIN32
66 aThreadID = reinterpret_cast<void *> (_beginthreadex (0, 0, CRXProxyWrapper, this, 0, 0));
67 if (aThreadID == NULL)
68 {
69 return -1;
70 }
71
72 CloseHandle (aThreadID);
73
74 return 0;
75#else
76 return pthread_create (&aThreadID, NULL, CRXProxyWrapper, this);
77#endif
78 /*----------------------------------------------------------------*/
79}
80
81int
82CRXProxy::Forward (void)
83{
84 int aResult = 0;
85 int aReceivedSize = 0;
86
87 const unsigned int aBufferSize = 1024 * 16;
88 char aBuffer[aBufferSize] = {0x00, };
89
90 CRXHttpRequest aHttpRequest;
91
92 CRXSocket aWebServer;
93
94 bool aIsMoreRequest = false;
95
96 /*----------------------------------------------------------------*/
97 do
98 {
99 /* BROWSER --- request ---> [PROXY] SERVER */
100 aResult = mClient.Receive (aBuffer, aBufferSize);
101 if (aResult < 0)
102 {
103 CRX_ERROR_ADD (mClient.GetErrorMessage ().c_str ());
104 CRX_ERROR (aResult, "Failed to receive from browser");
105 break;
106 }
107 aReceivedSize = aResult;
108
109 /* BROWSER ?--- waiting --- [PROXY] --- connect ---> SERVER */
110 if (!aWebServer)
111 {
112 /* parse http request */
113 aHttpRequest = aBuffer;
114
115 /* connect */
116 aResult = aWebServer.Connect (aHttpRequest.GetHost (), aHttpRequest.GetPort (), 1);
117 if (aResult < 0)
118 {
119 CRX_ERROR_ADD (aWebServer.GetErrorMessage ().c_str ());
120 CRX_ERROR (aResult, "Failed to connect to server <%s>", aHttpRequest.GetURL ().c_str ());
121 return aResult;
122 }
123 }
124
125 /* BROWSER ?--- waiting --- [PROXY] --- request ---> SERVER */
126 aResult = aWebServer.Send (aBuffer, aReceivedSize);
127 if (aResult != aReceivedSize)
128 {
129 CRX_ERROR_ADD (aWebServer.GetErrorMessage ().c_str ());
130 CRX_ERROR (aResult, "Failed to send to server <%s>", aHttpRequest.GetURL ().c_str ());
131 return aResult;
132 }
133
134 /* BROWSER <--- response--- [PROXY] <--- response--- SERVER */
135 for (;;)
136 {
137 memset (aBuffer, 0x00, aBufferSize);
138
139 aResult = aWebServer.Receive (aBuffer, aBufferSize);
140 if (aResult < 0)
141 {
142 CRX_ERROR_ADD (aWebServer.GetErrorMessage ().c_str ());
143 CRX_ERROR (aResult, "Failed to receive <%s>", aHttpRequest.GetURL ().c_str ());
144 break;
145 }
146 else if (aResult == 0)
147 {
148 break;
149 }
150 aReceivedSize = aResult;
151
152 aResult = mClient.Send (aBuffer, aReceivedSize);
153 if (aResult != aReceivedSize)
154 {
155 CRX_ERROR_ADD (mClient.GetErrorMessage ().c_str ());
156 CRX_ERROR (aResult, "Failed to send <%s>", aHttpRequest.GetURL ().c_str ());
157 break;
158 }
159 }
160 } while (aIsMoreRequest);
161
162 /*----------------------------------------------------------------*/
163 mClient.Close ();
164 aWebServer.Close ();
165
166 return aResult;
167}
Note: See TracBrowser for help on using the repository browser.