SBinetProxyMatcher.cpp
上传用户:xqtpzdz
上传日期:2022-05-21
资源大小:1764k
文件大小:5k
源码类别:

xml/soap/webservice

开发平台:

Visual C++

  1. /****************License************************************************
  2.  * Vocalocity OpenVXI
  3.  * Copyright (C) 2004-2005 by Vocalocity, Inc. All Rights Reserved.
  4.  * This program is free software; you can redistribute it and/or
  5.  * modify it under the terms of the GNU General Public License
  6.  * as published by the Free Software Foundation; either version 2
  7.  * of the License, or (at your option) any later version.
  8.  *  
  9.  * This program is distributed in the hope that it will be useful,
  10.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12.  * GNU General Public License for more details.
  13.  *
  14.  * You should have received a copy of the GNU General Public License
  15.  * along with this program; if not, write to the Free Software
  16.  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  17.  * Vocalocity, the Vocalocity logo, and VocalOS are trademarks or 
  18.  * registered trademarks of Vocalocity, Inc. 
  19.  * OpenVXI is a trademark of Scansoft, Inc. and used under license 
  20.  * by Vocalocity.
  21.  ***********************************************************************/
  22. #if _MSC_VER >= 1100    // Visual C++ 5.x
  23. #pragma warning( disable : 4786 4503 )
  24. #endif
  25. #include "SBinetProxyMatcher.hpp"
  26. #include "SBinetCookie.h"
  27. #include "HttpUtils.hpp"
  28. #include "ap_ctype.h"
  29. // SBinetProxyMatcher::SBinetProxyMatcher
  30. // Refer to SBinetProxyMatcher.hpp for doc.
  31. SBinetProxyMatcher::SBinetProxyMatcher(const char *domain, const char *path,
  32.                                        const char *proxyServer, int proxyPort)
  33. {
  34.   if (domain)
  35.     _domain = domain;
  36.   if (path && *path)
  37.   {
  38.     _path = path;
  39.     int len = _path.length();
  40.     if (--len > 0 && _path[len] == '/')
  41.       _path.resize(len);
  42.   }
  43.   else
  44.     _path = "/";
  45.   if (proxyServer)
  46.     _proxyServer = proxyServer;
  47.   _proxyPort = proxyPort;
  48. }
  49. // SBinetProxyMatcher::~SBinetProxyMatcher
  50. // Refer to SBinetProxyMatcher.hpp for doc.
  51. SBinetProxyMatcher::~SBinetProxyMatcher()
  52. {}
  53. SBinetProxyMatcher *SBinetProxyMatcher::createMatcher(const char *rule, const SWIutilLogger *logger)
  54. {
  55.   if (!rule)
  56.   {
  57.     return new SBinetProxyMatcher(NULL,NULL,NULL,0);
  58.   }
  59.   register const char *p = rule;
  60.   // skip any leading whitespace.
  61.   while (*p && ap_isspace(*p)) p++;
  62.   // Extract domain.
  63.   const char *domBeg = p;
  64.   // Domain goes up to the / or |, but fail if we find any whitespace in
  65.   // between.
  66.   while (*p && *p != '/' && *p != '|' && !ap_isspace(*p)) p++;
  67.   // Got end of domain.
  68.   const char *domEnd = p;
  69.   // If we stop because a whitespace, the next non whitespace character has to
  70.   // be a |.
  71.   if (*p && ap_isspace(*p))
  72.   {
  73.     do
  74.     {
  75.       p++;
  76.     }
  77.     while (*p && ap_isspace(*p));
  78.     if (*p && *p != '|')
  79.     {
  80.       if (logger) logger->Error(600,NULL);
  81.       return NULL;
  82.     }
  83.   }
  84.   // Extract path if present.
  85.   const char *pathBeg = p;
  86.   const char *pathEnd = pathBeg;
  87.   if (*p == '/')
  88.   {
  89.     // Path goes to the | or a whitespace character.
  90.     while (*p && *p != '|' && !ap_isspace(*p)) p++;
  91.     pathEnd = p;
  92.     // Skip whitespaces in p.
  93.     while (*p && ap_isspace(*p)) p++;
  94.   }
  95.   // Extract proxyServer if present.
  96.   const char *proxyBeg = p;
  97.   const char *proxyEnd = p;
  98.   int proxyPort = 0;
  99.   if (*p == '|')
  100.   {
  101.     // skip the vertical bar.
  102.     p++;
  103.     // Skip any leading character in the proxy server name.
  104.     while (*p && ap_isspace(*p)) p++;
  105.     proxyBeg = p;
  106.     // Read the proxy server name.
  107.     while (*p && *p != ':' && !ap_isspace(*p)) p++;
  108.     proxyEnd = p;
  109.     if (proxyEnd != proxyBeg)
  110.     {
  111.       // If we stopped because of any other reason than a ':', it is an error
  112.       // as the port number is mandatory.
  113.       if (*p != ':')
  114.       {
  115.         if (logger) logger->Error(601,NULL);
  116.         return NULL;
  117.       }
  118.       // skip the colon.
  119.       p++;
  120.       while (*p && ap_isdigit(*p))
  121.       {
  122.         proxyPort *= 10;
  123.         // overflow check.
  124.         if (proxyPort < 0) break;
  125.         proxyPort += *p - '0';
  126.         p++;
  127.       }
  128.       // Check for invalid character right after the port spec.
  129.       if (proxyPort <= 0 || (*p && !ap_isspace(*p)))
  130.       {
  131.         if (logger) logger->Error(602,NULL);
  132.         return NULL;
  133.       }
  134.       // skip any whitespace left.
  135.       while (*p && ap_isspace(*p)) p++;
  136.     }
  137.     else if (*p)
  138.     {
  139.       if (logger) logger->Error(604, NULL);
  140.       return NULL;
  141.     }
  142.   }
  143.   // Make sure there are no extra characters.
  144.   if (*p)
  145.   {
  146.     if (logger) logger->Error(603,NULL);
  147.     return NULL;
  148.   }
  149.   // If we get here, we have all the information to build the proxy matcher.
  150.   SBinetNString domain(domBeg, domEnd - domBeg);
  151.   SBinetNString path(pathBeg, pathEnd - pathBeg);
  152.   SBinetNString proxyServer(proxyBeg, proxyEnd - proxyBeg);
  153.   return new SBinetProxyMatcher(domain.c_str(), path.c_str(), proxyServer.c_str(), proxyPort);
  154. }
  155. bool SBinetProxyMatcher::matches(const char *domain, const char *path) const
  156. {
  157.   return (SBinetCookie::matchDomain(_domain.c_str(), domain) &&
  158.           SBinetCookie::matchPath(_path.c_str(), path));
  159. }