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

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

#1 fix and arrange exception handling

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