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

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

#1 fix error on linux for r18

File size: 3.8 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 return (THREAD_FUNCTION_RETURN)0;
44}
45
46CRXProxy::CRXProxy (const int aSocket)
47{
48 /*----------------------------------------------------------------*/
49 mClient = aSocket;
50 /*----------------------------------------------------------------*/
51}
52
53int
54CRXProxy::ForwardMT (void)
55{
56 THREAD_TYPE aThreadID = (THREAD_TYPE)0;
57 /*----------------------------------------------------------------*/
58#ifdef _WIN32
59 aThreadID = CreateThread (0, 0, CRXProxyWrapper, this, 0, 0);
60 if (aThreadID == NULL)
61 {
62 return -1;
63 }
64
65 return 0;
66#else
67 return pthread_create (&aThreadID, NULL, CRXProxyWrapper, this);
68#endif
69 /*----------------------------------------------------------------*/
70}
71
72int
73CRXProxy::Forward (void)
74{
75 int aResult = 0;
76 int aReceivedSize = 0;
77
78 const unsigned int aBufferSize = 1024 * 16;
79 char aBuffer[aBufferSize] = {0x00, };
80
81 CRXHttpRequest aHttpRequest;
82
83 CRXSocket aWebServer;
84
85 bool aIsMoreRequest = false;
86
87 /*----------------------------------------------------------------*/
88 do
89 {
90 /* BROWSER --- request ---> [PROXY] SERVER */
91 aResult = mClient.Receive (aBuffer, aBufferSize);
92 if (aResult < 0)
93 {
94 CRX_ERROR_ADD (mClient.GetErrorMessage ().c_str ());
95 CRX_ERROR (aResult, "failed to receive from browser");
96 break;
97 }
98 aReceivedSize = aResult;
99
100 /* BROWSER ?--- waiting --- [PROXY] --- connect ---> SERVER */
101 if (!aWebServer)
102 {
103 /* parse http request */
104 aHttpRequest = aBuffer;
105
106 /* connect */
107 aResult = aWebServer.Connect (aHttpRequest.GetHost (), aHttpRequest.GetPort (), 1);
108 if (aResult < 0)
109 {
110 CRX_ERROR_ADD (aWebServer.GetErrorMessage ().c_str ());
111 CRX_ERROR (aResult, "failed to connect to server <%s>", aHttpRequest.GetURL ().c_str ());
112 return aResult;
113 }
114 }
115
116 /* BROWSER ?--- waiting --- [PROXY] --- request ---> SERVER */
117 aResult = aWebServer.Send (aBuffer, aReceivedSize);
118 if (aResult != aReceivedSize)
119 {
120 CRX_ERROR_ADD (aWebServer.GetErrorMessage ().c_str ());
121 CRX_ERROR (aResult, "failed to send to server <%s>", aHttpRequest.GetURL ().c_str ());
122 return aResult;
123 }
124
125 /* BROWSER <--- response--- [PROXY] <--- response--- SERVER */
126 for (;;)
127 {
128 memset (aBuffer, 0x00, aBufferSize);
129
130 aResult = aWebServer.Receive (aBuffer, aBufferSize);
131 if (aResult < 0)
132 {
133 CRX_ERROR_ADD (aWebServer.GetErrorMessage ().c_str ());
134 CRX_ERROR (aResult, "failed to receive <%s>", aHttpRequest.GetURL ().c_str ());
135 break;
136 }
137 else if (aResult == 0)
138 {
139 break;
140 }
141 aReceivedSize = aResult;
142
143 aResult = mClient.Send (aBuffer, aReceivedSize);
144 if (aResult != aReceivedSize)
145 {
146 CRX_ERROR_ADD (mClient.GetErrorMessage ().c_str ());
147 CRX_ERROR (aResult, "failed to send <%s>", aHttpRequest.GetURL ().c_str ());
148 break;
149 }
150 }
151 } while (aIsMoreRequest);
152
153 /*----------------------------------------------------------------*/
154 mClient.Close ();
155 aWebServer.Close ();
156
157 return aResult;
158}
Note: See TracBrowser for help on using the repository browser.