Advertisement
Guest User

URL Parser

a guest
Oct 19th, 2018
160
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.79 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <string.h> //  Для C++ #include <cstring>
  3. #include <stdlib.h> //  Для C++ #include <cstdlib>
  4.  
  5. #define PROTO_UNKNOWN   0
  6. #define PROTO_HTTP  1
  7. #define PROTO_HTTPS 2
  8. #define DEFAULT_PORT    80
  9.  
  10. //  Определение функций
  11. //-------------------------------------------------------------------
  12. //  Разбирает URL на составные части, внося изменения в строку в процессе
  13. //  разбора.
  14. //  В случае успеха возвращает 1, при неудаче 0
  15. //  Примечание - вообще-то порт должен быть unsigned short, но мы делаем
  16. //  его лонгом для удобства работы
  17. int parse_url( char* url, unsigned long *proto,
  18.         char** host, unsigned long* port,
  19.         char** url_path, char** url_arg );
  20. //-------------------------------------------------------------------
  21.  
  22. //  Реализация
  23. //-------------------------------------------------------------------
  24. int parse_url( char* url, unsigned long *proto,
  25.         char** host, unsigned long* port,
  26.         char** url_path, char** url_arg )
  27. {
  28.     int result = 0;
  29.     char*   ptr;
  30.     char*   start;
  31.  
  32.     //  Установим значения по умолчанию
  33.     *proto = PROTO_UNKNOWN;
  34.     *host = NULL;
  35.     *port = 0;
  36.     *url_path = NULL;
  37.     *url_arg = NULL;
  38.  
  39.     if( url )
  40.     {
  41.         start = url;
  42.         //  Найдем протокол
  43.         ptr = strstr( start, "://" );
  44.         if( ptr )
  45.         {
  46.             *ptr = '\0';
  47.             ptr++;
  48.             *ptr = '\0';
  49.             ptr++;
  50.             *ptr = '\0';
  51.             ptr++; 
  52.             //  Теперь ptr указывает на следующее поле
  53.             start = ptr;
  54.  
  55.             if( strcasecmp( url, "http" ) == 0 )
  56.             {
  57.                 *proto = PROTO_HTTP;
  58.                 result++;
  59.             }
  60.             else
  61.             if( strcasecmp( url, "https" ) == 0 )
  62.             {
  63.                 *proto = PROTO_HTTPS;
  64.                 result++;
  65.             }
  66.         }
  67.         else
  68.         {
  69.             //  Протокол вообще не указан - установм его в
  70.             //  протокол по умолчанию
  71.             *proto = PROTO_HTTP;
  72.             result++;
  73.         }
  74.  
  75.         //  Если первый этап по выделению типа протокола
  76.         //  завершился успешно, то перейдем ко второму этапу,
  77.         //  на котором выделим хост и порт
  78.         if( result )
  79.         {
  80.             result = 0;
  81.             //  Работаем дальше, если нам есть что разбирать
  82.             if( *start )
  83.             {
  84.                 //  ищем первый символ '/'
  85.                 ptr = strchr( start, '/' );
  86.                 if( ptr )
  87.                 {
  88.                     //  Терминируем строку
  89.                     *ptr = '\0';               
  90.                     //  Все, что идет после '/' - это
  91.                     //  данные URL (путь и аргументы)
  92.                     //  Сохраним это
  93.                     ptr++;
  94.                     if( *ptr )
  95.                     {
  96.                         *url_path = ptr;
  97.                     }
  98.                 }
  99.  
  100.                 //  ищем, есть ли у нас порт
  101.                 ptr = strchr( start, ':' );
  102.                 if( ptr )
  103.                 {
  104.                     *ptr = '\0';
  105.                     *host = start;
  106.                     ptr++;
  107.                     if( *ptr )
  108.                     {
  109.                         // Преобразуем порт в число
  110.                         *port = strtoul( ptr,
  111.                                 &start, 0 );
  112.                         // Удалось преобразовать
  113.                         // все цифры?
  114.                         if( *start == '\0' )
  115.                         {
  116.                             if( *port <= 0xFFFF )
  117.                             {
  118.                                 result++;
  119.                             }
  120.                         }
  121.                         else
  122.                         {
  123.                             // Нам попытались
  124.                             // подсунуть мусор
  125.                             *port = 0;
  126.                         }
  127.                     }
  128.                 }
  129.                 else
  130.                 {
  131.                     //  Порт не указан
  132.                     *host = start;
  133.                     *port = DEFAULT_PORT;
  134.                     result++;
  135.                 }
  136.             }
  137.         }
  138.  
  139.         //  Разберем остаток URL
  140.         if( *url_path )
  141.         {
  142.             ptr = strchr( *url_path, '?' );
  143.             //  Нашли разделитель?
  144.             if( ptr )
  145.             {
  146.                 *ptr = '\0';
  147.                 ptr++;
  148.  
  149.                 *url_arg = ptr;
  150.             }
  151.         }
  152.     }
  153.  
  154.     return  result;
  155. }
  156. //-------------------------------------------------------------------
  157.  
  158. int main( int argc, char* argv[] )
  159. {
  160.     int result = 0;
  161.     unsigned long   proto;
  162.     char*   host;
  163.     unsigned long   port;
  164.     char*   url_path;
  165.     char*   url_arg;
  166.  
  167.     if( argc > 1 )
  168.     {
  169.         if( parse_url( argv[1], &proto, &host, &port,
  170.                     &url_path, &url_arg ) )
  171.         {
  172.             switch( proto )
  173.             {
  174.                 case    PROTO_HTTP:
  175.                     printf( "Протокол HTTP\n" );
  176.                     break;
  177.                 case    PROTO_HTTPS:
  178.                     printf( "Протокол HTTPS\n" );
  179.                     break;
  180.                 default:
  181.                     printf( "Неизвестный протокол!\n" );
  182.             }
  183.             printf( "Хост: %s, Порт: %lu\n", host, port );
  184.             if( url_path )
  185.             {
  186.                 printf( "Путь: '%s'\n", url_path );
  187.             }
  188.             if( url_arg )
  189.             {
  190.                 printf( "Параметры: '%s'\n", url_arg );
  191.             }
  192.         }
  193.         else
  194.         {
  195.             printf( "Ошибка! Выявлен кривой URL!\n" );
  196.         }
  197.     }
  198.     else
  199.     {
  200.         printf( "Использование: %s: <URL>\n", argv[ 0 ] );
  201.     }
  202.  
  203.     return  result;
  204. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement