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

Last change on this file since 22 was 22, checked in by cheese, 11 years ago

#1 more fix main code and release thread

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 cout
17#else
18# define PRINT_ERROR
19#endif
20
21#ifdef _WIN32
22# include <Windows.h>
23# define THREAD_TYPE void *
24# define THREAD_FUNCTION_RETURN DWORD
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 = CreateThread (0, 0, CRXProxyWrapper, this, 0, 0);
67 if (aThreadID == NULL)
68 {
69 return -1;
70 }
71
72 return 0;
73#else
74 return pthread_create (&aThreadID, NULL, CRXProxyWrapper, this);
75#endif
76 /*----------------------------------------------------------------*/
77}
78
79int
80CRXProxy::Forward (void)
81{
82 int aResult = 0;
83 int aReceivedSize = 0;
84
85 const unsigned int aBufferSize = 1024 * 16;
86 char aBuffer[aBufferSize] = {0x00, };
87
88 CRXHttpRequest aHttpRequest;
89
90 CRXSocket aWebServer;
91
92 bool aIsMoreRequest = false;
93
94 /*----------------------------------------------------------------*/
95 do
96 {
97 /* BROWSER --- request ---> [PROXY] SERVER */
98 aResult = mClient.Receive (aBuffer, aBufferSize);
99 if (aResult < 0)
100 {
101 CRX_ERROR_ADD (mClient.GetErrorMessage ().c_str ());
102 CRX_ERROR (aResult, "Failed to receive from browser");
103 break;
104 }
105 aReceivedSize = aResult;
106
107 /* BROWSER ?--- waiting --- [PROXY] --- connect ---> SERVER */
108 if (!aWebServer)
109 {
110 /* parse http request */
111 aHttpRequest = aBuffer;
112
113 /* connect */
114 aResult = aWebServer.Connect (aHttpRequest.GetHost (), aHttpRequest.GetPort (), 1);
115 if (aResult < 0)
116 {
117 CRX_ERROR_ADD (aWebServer.GetErrorMessage ().c_str ());
118 CRX_ERROR (aResult, "Failed to connect to server <%s>", aHttpRequest.GetURL ().c_str ());
119 return aResult;
120 }
121 }
122
123 /* BROWSER ?--- waiting --- [PROXY] --- request ---> SERVER */
124 aResult = aWebServer.Send (aBuffer, aReceivedSize);
125 if (aResult != aReceivedSize)
126 {
127 CRX_ERROR_ADD (aWebServer.GetErrorMessage ().c_str ());
128 CRX_ERROR (aResult, "Failed to send to server <%s>", aHttpRequest.GetURL ().c_str ());
129 return aResult;
130 }
131
132 /* BROWSER <--- response--- [PROXY] <--- response--- SERVER */
133 for (;;)
134 {
135 memset (aBuffer, 0x00, aBufferSize);
136
137 aResult = aWebServer.Receive (aBuffer, aBufferSize);
138 if (aResult < 0)
139 {
140 CRX_ERROR_ADD (aWebServer.GetErrorMessage ().c_str ());
141 CRX_ERROR (aResult, "Failed to receive <%s>", aHttpRequest.GetURL ().c_str ());
142 break;
143 }
144 else if (aResult == 0)
145 {
146 break;
147 }
148 aReceivedSize = aResult;
149
150 aResult = mClient.Send (aBuffer, aReceivedSize);
151 if (aResult != aReceivedSize)
152 {
153 CRX_ERROR_ADD (mClient.GetErrorMessage ().c_str ());
154 CRX_ERROR (aResult, "Failed to send <%s>", aHttpRequest.GetURL ().c_str ());
155 break;
156 }
157 }
158 } while (aIsMoreRequest);
159
160 /*----------------------------------------------------------------*/
161 mClient.Close ();
162 aWebServer.Close ();
163
164 return aResult;
165}
Note: See TracBrowser for help on using the repository browser.