source: cheroxy/trunk/src/main.cpp@ 15

Last change on this file since 15 was 15, checked in by cheese, 12 years ago

#1 modify error code handling

File size: 5.1 KB
Line 
1// LocalProxy.cpp : ÄÜ¼Ö ÀÀ¿ë ÇÁ·Î±×·¥¿¡ ´ëÇÑ ÁøÀÔÁ¡À» Á¤ÀÇÇÕ´Ï´Ù.
2//
3
4#ifdef _WIN32
5# define _CRT_SECURE_NO_WARNINGS
6# include <process.h>
7#else
8# include <errno.h>
9#endif
10
11#include "CRXSocket.h"
12#include "CRXHttpRequest.h"
13#include "CRXHttpResponse.h"
14
15#include <iostream>
16#include <iomanip>
17#include <sstream>
18
19#include <stdio.h>
20#include <string.h>
21
22using namespace std;
23
24/*-----------------------------------------------------------------*/
25int CRXCreateThread (int (* aThreadFunc) (void *), void * aThreadArg);
26int CRXProxyThread (void * aThreadArg);
27
28/* error */
29#ifdef _WIN32
30# define CRX_ERROR() GetLastError ()
31# ifndef __func__
32# define __func__ __FUNCTION__
33# endif
34#else
35# define CRX_ERROR() errno
36#endif
37
38#define CRX_PRINT_ERROR(__code, __message) \
39 do { \
40 char __error[1024] = {0x00, }; \
41 ostringstream __stream; \
42 __stream << __message; \
43 string __string = __stream.str (); \
44 sprintf (__error, "[%s][%d] (%d) %s\n", __func__, __LINE__, __code, __string.c_str ()); \
45 cout << __error; \
46 } while (0)
47
48typedef struct __crx_proxy_thread_argument__
49{
50 int mSocket;
51} CRXProxyThreadArgs;
52/*----------------------------------------------------------------*/
53
54int main (int argc, char* argv[])
55{
56 int aResult = 0;
57 const unsigned short aPort = 8080;
58
59 CRXSocket aSocket;
60 CRXProxyThreadArgs * aThreadArg;
61
62 /*----------------------------------------------------------------*/
63 /*----------------------------------------------------------------
64 * Initialize
65 *----------------------------------------------------------------*/
66 aResult = aSocket.CreateServer (aPort);
67 if (aResult < 0)
68 {
69 CRX_PRINT_ERROR (aResult, "failed to create server");
70 return aResult;
71 }
72
73 for (;;)
74 {
75 aResult = aSocket.Accept ();
76 if (aResult < 0)
77 {
78 CRX_PRINT_ERROR (aResult, "failed to accept");
79 break;
80 }
81
82 if ((aThreadArg = new(std::nothrow) CRXProxyThreadArgs) == NULL)
83 {
84 aResult = -1;
85 break;
86 }
87
88 memset (aThreadArg, 0x0, sizeof (CRXProxyThreadArgs));
89 aThreadArg->mSocket = aResult;
90
91 aResult = CRXCreateThread (CRXProxyThread, aThreadArg);
92 if (aResult < 0)
93 {
94 aResult = CRX_ERROR ();
95 CRX_PRINT_ERROR (aResult, "failed to create thread");
96 break;
97 }
98 }
99
100 /*----------------------------------------------------------------*/
101 aSocket.Close ();
102
103 return aResult;
104}
105
106int
107CRXCreateThread (int (* aThreadFunc) (void *), void * aThreadArg)
108{
109#ifdef _WIN32
110 return _beginthread ((void (*) (void *))aThreadFunc, 0, aThreadArg);
111#else
112 pthread_t aThreadID = 0;
113
114 return pthread_create (&aThreadID, NULL, (void * (*) (void *))aThreadFunc, aThreadArg);
115#endif
116}
117
118int
119CRXProxyThread (void * aThreadArg)
120{
121 int aResult = 0;
122 int aReceivedSize = 0;
123
124 const unsigned int aBufferSize = 1024 * 64;
125 char aBuffer[aBufferSize] = {0x00, };
126
127 CRXHttpRequest aHttpRequest;
128 CRXHttpResponse aHttpResponse;
129 string aUrl = "";
130 string aHost = "";
131 int aPort = 0;
132
133 CRXSocket aWebServer;
134 CRXSocket aWebBrowser = ((CRXProxyThreadArgs *)aThreadArg)->mSocket;
135
136 bool aIsMoreRequest = false;
137 /*----------------------------------------------------------------*/
138 delete (CRXProxyThreadArgs *)aThreadArg;
139
140 do
141 {
142 /* BROWSER --- request ---> [PROXY] SERVER */
143 aReceivedSize = aWebBrowser.Receive (aBuffer, aBufferSize);
144 if (aReceivedSize < 0)
145 {
146 CRX_PRINT_ERROR (aReceivedSize, "failed to receive from client (" << CRX_ERROR () << ")");
147 return aResult;
148 }
149
150 /* BROWSER ?--- waiting --- [PROXY] --- connect ---> SERVER */
151 if (!aWebServer)
152 {
153 /* parse http request */
154 aHttpRequest = aBuffer;
155
156 /* connect */
157 aResult = aWebServer.Connect (aHttpRequest.GetHost (), aHttpRequest.GetPort (), 1);
158 if (aResult < 0)
159 {
160 CRX_PRINT_ERROR (aResult, "failed to connect to server <" << aHost << ":" << aPort << "> (" << CRX_ERROR () << ")");
161 return aResult;
162 }
163 }
164
165 /* BROWSER ?--- waiting --- [PROXY] --- request ---> SERVER */
166 aResult = aWebServer.Send (aBuffer, aReceivedSize);
167 if (aResult != aReceivedSize)
168 {
169 CRX_PRINT_ERROR (aResult, "failed to send to server (" << CRX_ERROR () << ")");
170 return aResult;
171 }
172
173 /* BROWSER <--- response--- [PROXY] <--- response--- SERVER */
174 for (;;)
175 {
176 memset (aBuffer, 0x00, aBufferSize);
177
178 aResult = aWebServer.Receive (aBuffer, aBufferSize);
179 if (aResult < 0)
180 {
181 CRX_PRINT_ERROR (aResult, "failed to receive (" << CRX_ERROR () << ")");
182 break;
183 }
184 else if (aResult == 0)
185 {
186 break;
187 }
188 aReceivedSize = aResult;
189
190 aResult = aWebBrowser.Send (aBuffer, aReceivedSize);
191 if (aResult != aReceivedSize)
192 {
193 CRX_PRINT_ERROR (aResult, "failed to send (" << CRX_ERROR () << ")");
194 break;
195 }
196 }
197 } while (aIsMoreRequest);
198
199 /*----------------------------------------------------------------*/
200 aWebBrowser.Close ();
201 aWebServer.Close ();
202
203 return aResult;
204}
Note: See TracBrowser for help on using the repository browser.