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
RevLine 
[18]1/**
2 * CRXProxy.cpp
3 */
4
5#include "CRXSocket.h"
6#include "CRXHttpRequest.h"
7#include "CRXHttpResponse.h"
8
9#include "CRXProxy.h"
10
[19]11#include <string.h>
12
[18]13#ifdef _DEBUG
14# include <iostream>
15using namespace std;
[23]16# define PRINT_ERROR cerr
[18]17#else
18# define PRINT_ERROR
19#endif
20
21#ifdef _WIN32
[23]22# include <process.h>
[18]23# define THREAD_TYPE void *
[23]24# define THREAD_FUNCTION_RETURN unsigned int
[18]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
[19]34CRXProxyWrapper (void * aThreadArg)
[18]35{
[19]36 int aResult = 0;
37 CRXProxy * aProxy = (CRXProxy *) aThreadArg;
38
39 aResult = aProxy->Forward ();
40 if (aResult)
41 PRINT_ERROR << aProxy->GetErrorMessage ();
42
[22]43 delete aProxy;
[19]44 return (THREAD_FUNCTION_RETURN)0;
[18]45}
46
47CRXProxy::CRXProxy (const int aSocket)
48{
49 /*----------------------------------------------------------------*/
50 mClient = aSocket;
51 /*----------------------------------------------------------------*/
52}
53
[20]54CRXProxy *
55CRXProxy::GetNewInstance(const int aSocket)
56{
57 return new(std::nothrow) CRXProxy (aSocket);
58}
59
[18]60int
61CRXProxy::ForwardMT (void)
62{
63 THREAD_TYPE aThreadID = (THREAD_TYPE)0;
64 /*----------------------------------------------------------------*/
65#ifdef _WIN32
[23]66 aThreadID = reinterpret_cast<void *> (_beginthreadex (0, 0, CRXProxyWrapper, this, 0, 0));
[18]67 if (aThreadID == NULL)
68 {
69 return -1;
70 }
71
[23]72 CloseHandle (aThreadID);
73
[18]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 {
[19]103 CRX_ERROR_ADD (mClient.GetErrorMessage ().c_str ());
[20]104 CRX_ERROR (aResult, "Failed to receive from browser");
[18]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 {
[19]119 CRX_ERROR_ADD (aWebServer.GetErrorMessage ().c_str ());
[20]120 CRX_ERROR (aResult, "Failed to connect to server <%s>", aHttpRequest.GetURL ().c_str ());
[18]121 return aResult;
122 }
123 }
124
125 /* BROWSER ?--- waiting --- [PROXY] --- request ---> SERVER */
126 aResult = aWebServer.Send (aBuffer, aReceivedSize);
127 if (aResult != aReceivedSize)
128 {
[19]129 CRX_ERROR_ADD (aWebServer.GetErrorMessage ().c_str ());
[20]130 CRX_ERROR (aResult, "Failed to send to server <%s>", aHttpRequest.GetURL ().c_str ());
[18]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 {
[19]142 CRX_ERROR_ADD (aWebServer.GetErrorMessage ().c_str ());
[20]143 CRX_ERROR (aResult, "Failed to receive <%s>", aHttpRequest.GetURL ().c_str ());
[18]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 {
[19]155 CRX_ERROR_ADD (mClient.GetErrorMessage ().c_str ());
[20]156 CRX_ERROR (aResult, "Failed to send <%s>", aHttpRequest.GetURL ().c_str ());
[18]157 break;
158 }
159 }
160 } while (aIsMoreRequest);
161
162 /*----------------------------------------------------------------*/
163 mClient.Close ();
164 aWebServer.Close ();
165
166 return aResult;
[19]167}
Note: See TracBrowser for help on using the repository browser.