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

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

#1 fix to return from CRXProxy::ReceiveResponse if receive zero-byte(infinite-loop bug).

File size: 6.1 KB
Line 
1/**
2 * CRXProxy.cpp
3 */
4
5#include "CRXProxy.h"
6
7#include <string.h>
8
9CRXFilter CRXProxy::mFilter;
10
11CRXProxy::CRXProxy (const int aSocket)
12 : mServerTimeout (0)
13{
14 /*----------------------------------------------------------------*/
15 if (aSocket < 0)
16 return ;
17
18 mClient = aSocket;
19 /*----------------------------------------------------------------*/
20}
21
22CRXProxy::~CRXProxy (void)
23{
24 /*----------------------------------------------------------------*/
25 Close ();
26 /*----------------------------------------------------------------*/
27}
28
29void
30CRXProxy::SetServerTimeout (const int aTimeout)
31{
32 /*----------------------------------------------------------------*/
33 mServerTimeout = aTimeout;
34 /*----------------------------------------------------------------*/
35}
36
37void
38CRXProxy::Close (void)
39{
40 /*----------------------------------------------------------------*/
41 mServer.Close ();
42 mClient.Close ();
43 /*----------------------------------------------------------------*/
44}
45
46int
47CRXProxy::Forward (void)
48{
49 int aResult = 0;
50
51 /*----------------------------------------------------------------*/
52 aResult = ReceiveRequest ();
53 if (aResult < 0)
54 {
55 aResult = ERROR_PROXY_FAILED_TO_RECEIVE_REQUEST;
56 CRX_ERROR_SET (aResult, "Failed to receive from client.");
57 }
58
59 aResult = SendRequest ();
60 if (aResult < 0)
61 {
62 aResult = ERROR_PROXY_FAILED_TO_SEND_REQUEST;
63 CRX_ERROR_SET (aResult, "Failed to send to server.");
64 return aResult;
65 }
66
67 aResult = ReceiveResponse ();
68 if (aResult < 0)
69 {
70 aResult = ERROR_PROXY_FAILED_TO_RECEIVE_RESPONSE;
71 CRX_ERROR_SET (aResult, "Failed to receive from server.");
72 }
73
74 aResult = SendResponse ();
75 if (aResult < 0)
76 {
77 aResult = ERROR_PROXY_FAILED_TO_SEND_RESPONSE;
78 CRX_ERROR_SET (aResult, "Failed to send to client.");
79 return aResult;
80 }
81 /*----------------------------------------------------------------*/
82
83 return aResult;
84}
85
86int
87CRXProxy::ReceiveRequest (void)
88{
89 int aResult = 0;
90 char aBuffer;
91
92 std::string aHttpHeader;
93
94 /*----------------------------------------------------------------*/
95 for (;;)
96 {
97 aResult = mClient.Receive (&aBuffer, 1);
98 if (aResult < 0)
99 {
100 aResult = ERROR_PROXY_FAILED_TO_RECEIVE_REQUEST;
101 CRX_ADD_SUBCLASS_ERROR (mClient);
102 CRX_ERROR_SET (aResult, "Failed to receive from client.");
103 return aResult;
104 }
105 aHttpHeader += aBuffer;
106 if (aHttpHeader.rfind (CRLF2) != std::string::npos)
107 break;
108 }
109
110 mHttpRequest.SetHeader (aHttpHeader.c_str ());
111 /*----------------------------------------------------------------*/
112
113 return aResult < 0 ? aResult : 0;
114}
115
116int
117CRXProxy::SendRequest (void)
118{
119 int aResult = 0;
120 int aLength = mHttpRequest.GetHeader ().length ();
121
122 /*----------------------------------------------------------------*/
123 aResult = mServer.Connect (mHttpRequest.GetHost (), mHttpRequest.GetPort (), mServerTimeout);
124 if (aResult < 0)
125 {
126 aResult = ERROR_PROXY_FAILED_TO_CONNECT_TO_SERVER;
127 CRX_ADD_SUBCLASS_ERROR (mServer);
128 CRX_ERROR_SET (aResult, "Failed to connect to server <%s>.", mHttpRequest.GetURL ().c_str ());
129 return aResult;
130 }
131
132 aResult = mServer.Send (mHttpRequest.GetHeader ().c_str (), aLength);
133 if (aResult != aLength)
134 {
135 CRX_ADD_SUBCLASS_ERROR (mServer);
136 CRX_ERROR_SET (aResult, "Failed to send to server <%s>.", mHttpRequest.GetURL ().c_str ());
137 }
138 /*----------------------------------------------------------------*/
139
140 return aResult < 0 ? aResult : 0;
141}
142
143int
144CRXProxy::ReceiveResponse (void)
145{
146 int aResult = 0;
147 char aBuffer;
148
149 std::string aHttpHeader;
150 bool aRemainHeader = true;
151
152 /*----------------------------------------------------------------*/
153 for (;;)
154 {
155 aResult = mServer.Receive (&aBuffer, 1);
156 if (aResult < 0)
157 {
158 aResult = ERROR_PROXY_FAILED_TO_RECEIVE_REQUEST;
159 CRX_ADD_SUBCLASS_ERROR (mServer);
160 CRX_ERROR_SET (aResult, "Failed to receive from server.");
161 return aResult;
162 }
163 else if (aResult == 0)
164 {
165 CRX_ADD_SUBCLASS_ERROR (mServer);
166 CRX_ERROR_SET (aResult, "Receive zero-byte from server.");
167 break;
168 }
169
170 if (aRemainHeader)
171 {
172 aHttpHeader += aBuffer;
173 if (aHttpHeader.rfind (CRLF2) != std::string::npos)
174 {
175 mHttpResponse.SetHeader (aHttpHeader.c_str ());
176 aRemainHeader = false;
177 }
178 }
179 else
180 {
181 aResult = mHttpResponse.SetContent (&aBuffer, aResult);
182 if (aResult < 0)
183 {
184 aResult = ERROR_PROXY_FAILED_TO_SET_RESPONSE;
185 CRX_ERROR_SET (aResult, "Failed to set response.");
186 return aResult;
187 }
188 else if (aResult == 0)
189 break;
190 }
191 }
192 /*----------------------------------------------------------------*/
193
194 return aResult < 0 ? aResult : 0;
195}
196
197int
198CRXProxy::SendResponse (void)
199{
200 int aResult = 0;
201 int aLength = 0;
202 /*----------------------------------------------------------------*/
203 aLength = mHttpResponse.GetHeader ().length ();
204 aResult = mClient.Send (mHttpResponse.GetHeader ().c_str (), aLength);
205 if (aResult != aLength)
206 {
207 CRX_ADD_SUBCLASS_ERROR (mClient);
208 CRX_ERROR_SET (aResult, "Failed to send to client.");
209 return aResult;
210 }
211
212 aLength = mHttpResponse.GetContentLength ();
213 aResult = mClient.Send (mHttpResponse.GetContentBody (), aLength);
214 if (aResult != aLength)
215 {
216 CRX_ADD_SUBCLASS_ERROR (mClient);
217 CRX_ERROR_SET (aResult, "Failed to send to client.");
218 }
219 /*----------------------------------------------------------------*/
220
221 return aResult < 0 ? aResult : 0;
222}
223
224CRXFilter &
225CRXProxy::GetFilter (void) const
226{
227 /*----------------------------------------------------------------*/
228 /*----------------------------------------------------------------*/
229
230 return mFilter;
231}
232
233CRXHttpRequest &
234CRXProxy::GetHttpRequest (void)
235{
236 /*----------------------------------------------------------------*/
237 /*----------------------------------------------------------------*/
238
239 return mHttpRequest;
240}
241
242CRXHttpResponse &
243CRXProxy::GetHttpResponse (void)
244{
245 /*----------------------------------------------------------------*/
246 /*----------------------------------------------------------------*/
247
248 return mHttpResponse;
249}
Note: See TracBrowser for help on using the repository browser.