00001
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031 #ifdef _MSC_VER
00032 #pragma warning(disable:4786)
00033 #endif
00034 #include "AjpBaseSocket.h"
00035 #include "ajp13.h"
00036
00037 #ifdef SOCKETS_NAMESPACE
00038 namespace SOCKETS_NAMESPACE {
00039 #endif
00040
00041 #ifdef _DEBUG
00042 #define DEB(x) x
00043 #else
00044 #define DEB(x)
00045 #endif
00046
00047
00048
00049 AjpBaseSocket::Initializer AjpBaseSocket::Init;
00050
00051
00052
00053 AjpBaseSocket::Initializer::Initializer()
00054 {
00055
00056 Header[HTTP_REQUEST_ACCEPT] = "accept";
00057 Header[HTTP_REQUEST_ACCEPT_CHARSET] = "accept-charset";
00058 Header[HTTP_REQUEST_ACCEPT_ENCODING] = "accept-encoding";
00059 Header[HTTP_REQUEST_ACCEPT_LANGUAGE] = "accept-language";
00060 Header[HTTP_REQUEST_AUTHORIZATION] = "authorization";
00061 Header[HTTP_REQUEST_CONNECTION] = "connection";
00062 Header[HTTP_REQUEST_CONTENT_TYPE] = "content-type";
00063 Header[HTTP_REQUEST_CONTENT_LENGTH] = "content-length";
00064 Header[HTTP_REQUEST_COOKIE] = "cookie";
00065 Header[HTTP_REQUEST_COOKIE2] = "cookie2";
00066 Header[HTTP_REQUEST_HOST] = "host";
00067 Header[HTTP_REQUEST_PRAGMA] = "pragma";
00068 Header[HTTP_REQUEST_REFERER] = "referer";
00069 Header[HTTP_REQUEST_USER_AGENT] = "user-agent";
00070
00071 Method[HTTP_METHOD_OPTIONS] = "OPTIONS";
00072 Method[HTTP_METHOD_GET] = "GET";
00073 Method[HTTP_METHOD_HEAD] = "HEAD";
00074 Method[HTTP_METHOD_POST] = "POST";
00075 Method[HTTP_METHOD_PUT] = "PUT";
00076 Method[HTTP_METHOD_DELETE] = "DELETE";
00077 Method[HTTP_METHOD_TRACE] = "TRACE";
00078 Method[HTTP_METHOD_PROPFIND] = "PROPFIND";
00079 Method[HTTP_METHOD_PROPPATCH] = "PROPPATCH";
00080 Method[HTTP_METHOD_MKCOL] = "MKCOL";
00081 Method[HTTP_METHOD_COPY] = "COPY";
00082 Method[HTTP_METHOD_MOVE] = "MOVE";
00083 Method[HTTP_METHOD_LOCK] = "LOCK";
00084 Method[HTTP_METHOD_UNLOCK] = "UNLOCK";
00085 Method[HTTP_METHOD_ACL] = "ACL";
00086 Method[HTTP_METHOD_REPORT] = "REPORT";
00087 Method[HTTP_METHOD_VERSION_CONTROL] = "VERSION_CONTROL";
00088 Method[HTTP_METHOD_CHECKIN] = "CHECKIN";
00089 Method[HTTP_METHOD_CHECKOUT] = "CHECKOUT";
00090 Method[HTTP_METHOD_UNCHECKOUT] = "UNCHECKOUT";
00091 Method[HTTP_METHOD_SEARCH] = "SEARCH";
00092 Method[HTTP_METHOD_MKWORKSPACE] = "MKWORKSPACE";
00093 Method[HTTP_METHOD_UPDATE] = "UPDATE";
00094 Method[HTTP_METHOD_LABEL] = "LABEL";
00095 Method[HTTP_METHOD_MERGE] = "MERGE";
00096 Method[HTTP_METHOD_BASELINE_CONTROL] = "BASELINE_CONTROL";
00097 Method[HTTP_METHOD_MKACTIVITY] = "MKACTIVITY";
00098
00099 Attribute[ATTR_CONTEXT] = "context";
00100 Attribute[ATTR_SERVLET_PATH] = "servlet_path";
00101 Attribute[ATTR_REMOTE_USER] = "remote_user";
00102 Attribute[ATTR_AUTH_TYPE] = "auth_type";
00103 Attribute[ATTR_QUERY_STRING] = "query_string";
00104 Attribute[ATTR_ROUTE] = "route";
00105 Attribute[ATTR_SSL_CERT] = "ssl_cert";
00106 Attribute[ATTR_SSL_CIPHER] = "ssl_cipher";
00107 Attribute[ATTR_SSL_SESSION] = "ssl_session";
00108 Attribute[ATTR_SSL_KEY_SIZE] = "ssl_key_size";
00109 Attribute[ATTR_SECRET] = "secret";
00110 Attribute[ATTR_STORED_METHOD] = "stored_method";
00111
00112 ResponseHeader["content-type"] = 0xa001;
00113 ResponseHeader["content-language"] = 0xa002;
00114 ResponseHeader["content-length"] = 0xa003;
00115 ResponseHeader["date"] = 0xa004;
00116 ResponseHeader["last-modified"] = 0xa005;
00117 ResponseHeader["location"] = 0xa006;
00118 ResponseHeader["set-cookie"] = 0xa007;
00119 ResponseHeader["set-cookie2"] = 0xa008;
00120 ResponseHeader["servlet-engine"] = 0xa009;
00121 ResponseHeader["status"] = 0xa00a;
00122 ResponseHeader["www-authenticate"] = 0xa00b;
00123 }
00124
00125
00126
00127 AjpBaseSocket::AjpBaseSocket(ISocketHandler& h) : TcpSocket(h)
00128 , m_state(0)
00129 , m_length(4)
00130 , m_ptr(0)
00131 {
00132 }
00133
00134
00135
00136 void AjpBaseSocket::OnRawData(const char *buf, size_t sz)
00137 {
00138 DEB(fprintf(stderr, "OnRawData: %d bytes\n", sz);)
00139 size_t ptr = 0;
00140 while (true)
00141 {
00142 size_t left = sz - ptr;
00143 DEB(fprintf(stderr, " left: %d bytes\n", left);
00144 fprintf(stderr, " state: %d\n", m_state);)
00145 switch (m_state)
00146 {
00147 case 0:
00148 {
00149 size_t missing = m_length - m_ptr;
00150 short len = (short)(missing < left ? missing : left);
00151 memcpy(m_message + m_ptr, buf + ptr, len);
00152 m_ptr += len;
00153 ptr += len;
00154 if (m_ptr < m_length)
00155 {
00156 return;
00157 }
00158 int p = 0;
00159 short id = get_integer(m_message, p);
00160 short length = get_integer(m_message, p);
00161 OnHeader(id, length);
00162 m_state = 1;
00163 m_length = length;
00164 m_ptr = 0;
00165 }
00166 break;
00167 case 1:
00168 {
00169 size_t missing = m_length - m_ptr;
00170 short len = (short)(missing < left ? missing : left);
00171 memcpy(m_message + m_ptr, buf + ptr, len);
00172 m_ptr += len;
00173 ptr += len;
00174 if (m_ptr < m_length)
00175 {
00176 return;
00177 }
00178 OnPacket(m_message, m_ptr);
00179 m_state = 0;
00180 m_length = 4;
00181 m_ptr = 0;
00182 }
00183 break;
00184 }
00185 }
00186 }
00187
00188
00189
00190 unsigned char AjpBaseSocket::get_byte(const char *buf, int& ptr)
00191 {
00192 return (unsigned char)buf[ptr++];
00193 }
00194
00195
00196
00197 bool AjpBaseSocket::get_boolean(const char *buf, int& ptr)
00198 {
00199 return ( (unsigned char)buf[ptr++] & 1) == 1 ? true : false;
00200 }
00201
00202
00203
00204 short AjpBaseSocket::get_integer(const char *buf, int& ptr)
00205 {
00206 short n;
00207 memcpy(&n, buf + ptr, 2);
00208 ptr += 2;
00209 return ntohs(n);
00210 }
00211
00212
00213
00214 std::string AjpBaseSocket::get_string(const char *buf, int& ptr)
00215 {
00216 short len = get_integer(buf, ptr);
00217 if (len != -1)
00218 {
00219 std::string tmp = buf + ptr;
00220 ptr += len;
00221 ptr++;
00222 tmp.resize(len);
00223 return tmp;
00224 }
00225 return "";
00226 }
00227
00228
00229
00230 void AjpBaseSocket::put_byte(char *buf, int& ptr, unsigned char zz)
00231 {
00232 buf[ptr++] = zz;
00233 }
00234
00235
00236
00237 void AjpBaseSocket::put_boolean(char *buf, int& ptr, bool zz)
00238 {
00239 buf[ptr++] = zz ? 1 : 0;
00240 }
00241
00242
00243
00244 void AjpBaseSocket::put_integer(char *buf, int& ptr, short zz)
00245 {
00246 short tmp = htons(zz);
00247 memcpy(buf + ptr, &tmp, 2);
00248 ptr += 2;
00249 }
00250
00251
00252
00253 void AjpBaseSocket::put_string(char *buf, int& ptr, const std::string& zz)
00254 {
00255 put_integer(buf, ptr, (short)zz.size() );
00256 memcpy(buf + ptr, zz.c_str(), zz.size());
00257 ptr += (int)zz.size();
00258 put_byte(buf, ptr, 0);
00259 }
00260
00261
00262 #ifdef SOCKETS_NAMESPACE
00263 }
00264 #endif
00265
00266