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

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

#1 work for CRXProxy and CRXException

File size: 3.7 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#ifdef _DEBUG
12# include <iostream>
13using namespace std;
14# define PRINT_ERROR cout
15#else
16# define PRINT_ERROR
17#endif
18
19#ifdef _WIN32
20# include <Windows.h>
21# define THREAD_TYPE void *
22# define THREAD_FUNCTION_RETURN DWORD
23# define THREAD_FUNCTION_CALLING_CONVENTION WINAPI
24#else
25# define THREAD_TYPE pthread_t
26# define THREAD_FUNCTION_RETURN void *
27# define THREAD_FUNCTION_CALLING_CONVENTION
28#endif
29
30THREAD_FUNCTION_RETURN
31THREAD_FUNCTION_CALLING_CONVENTION
32CRXProxyWrapper (void * aProxy)
33{
34 return (THREAD_FUNCTION_RETURN)((CRXProxy *) aProxy)->Forward ();
35}
36
37CRXProxy::CRXProxy (const int aSocket)
38{
39 /*----------------------------------------------------------------*/
40 mClient = aSocket;
41 /*----------------------------------------------------------------*/
42}
43
44int
45CRXProxy::ForwardMT (void)
46{
47 THREAD_TYPE aThreadID = (THREAD_TYPE)0;
48 /*----------------------------------------------------------------*/
49#ifdef _WIN32
50 aThreadID = CreateThread (0, 0, CRXProxyWrapper, this, 0, 0);
51 if (aThreadID == NULL)
52 {
53 return -1;
54 }
55
56 return 0;
57#else
58 return pthread_create (&aThreadID, NULL, CRXProxyWrapper, this);
59#endif
60 /*----------------------------------------------------------------*/
61}
62
63int
64CRXProxy::Forward (void)
65{
66 int aResult = 0;
67 int aReceivedSize = 0;
68
69 const unsigned int aBufferSize = 1024 * 16;
70 char aBuffer[aBufferSize] = {0x00, };
71
72 CRXHttpRequest aHttpRequest;
73
74 CRXSocket aWebServer;
75
76 bool aIsMoreRequest = false;
77
78 /*----------------------------------------------------------------*/
79 do
80 {
81 /* BROWSER --- request ---> [PROXY] SERVER */
82 aResult = mClient.Receive (aBuffer, aBufferSize);
83 if (aResult < 0)
84 {
85 CRX_ERROR (aResult, "failed to receive from browser");
86 PRINT_ERROR << mClient.GetErrorMessage() << GetErrorMessage();
87 break;
88 }
89 aReceivedSize = aResult;
90
91 /* BROWSER ?--- waiting --- [PROXY] --- connect ---> SERVER */
92 if (!aWebServer)
93 {
94 /* parse http request */
95 aHttpRequest = aBuffer;
96
97 /* connect */
98 aResult = aWebServer.Connect (aHttpRequest.GetHost (), aHttpRequest.GetPort (), 1);
99 if (aResult < 0)
100 {
101 CRX_ERROR (aResult, "failed to connect to server <%s>", aHttpRequest.GetURL ().c_str ());
102 PRINT_ERROR << aWebServer.GetErrorMessage() << GetErrorMessage();
103 return aResult;
104 }
105 }
106
107 /* BROWSER ?--- waiting --- [PROXY] --- request ---> SERVER */
108 aResult = aWebServer.Send (aBuffer, aReceivedSize);
109 if (aResult != aReceivedSize)
110 {
111 CRX_ERROR (aResult, "failed to send to server <%s>", aHttpRequest.GetURL ().c_str ());
112 PRINT_ERROR << aWebServer.GetErrorMessage() << GetErrorMessage();
113 return aResult;
114 }
115
116 /* BROWSER <--- response--- [PROXY] <--- response--- SERVER */
117 for (;;)
118 {
119 memset (aBuffer, 0x00, aBufferSize);
120
121 aResult = aWebServer.Receive (aBuffer, aBufferSize);
122 if (aResult < 0)
123 {
124 CRX_ERROR (aResult, "failed to receive <%s>", aHttpRequest.GetURL ().c_str ());
125 PRINT_ERROR << aWebServer.GetErrorMessage() << GetErrorMessage();
126 break;
127 }
128 else if (aResult == 0)
129 {
130 break;
131 }
132 aReceivedSize = aResult;
133
134 aResult = mClient.Send (aBuffer, aReceivedSize);
135 if (aResult != aReceivedSize)
136 {
137 CRX_ERROR (aResult, "failed to send <%s>", aHttpRequest.GetURL ().c_str ());
138 PRINT_ERROR << mClient.GetErrorMessage() << GetErrorMessage();
139 break;
140 }
141 }
142 } while (aIsMoreRequest);
143
144 /*----------------------------------------------------------------*/
145 mClient.Close ();
146 aWebServer.Close ();
147
148 return aResult;
149}
Note: See TracBrowser for help on using the repository browser.