Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <string.h> // Для C++ #include <cstring>
- #include <stdlib.h> // Для C++ #include <cstdlib>
- #define PROTO_UNKNOWN 0
- #define PROTO_HTTP 1
- #define PROTO_HTTPS 2
- #define DEFAULT_PORT 80
- // Определение функций
- //-------------------------------------------------------------------
- // Разбирает URL на составные части, внося изменения в строку в процессе
- // разбора.
- // В случае успеха возвращает 1, при неудаче 0
- // Примечание - вообще-то порт должен быть unsigned short, но мы делаем
- // его лонгом для удобства работы
- int parse_url( char* url, unsigned long *proto,
- char** host, unsigned long* port,
- char** url_path, char** url_arg );
- //-------------------------------------------------------------------
- // Реализация
- //-------------------------------------------------------------------
- int parse_url( char* url, unsigned long *proto,
- char** host, unsigned long* port,
- char** url_path, char** url_arg )
- {
- int result = 0;
- char* ptr;
- char* start;
- // Установим значения по умолчанию
- *proto = PROTO_UNKNOWN;
- *host = NULL;
- *port = 0;
- *url_path = NULL;
- *url_arg = NULL;
- if( url )
- {
- start = url;
- // Найдем протокол
- ptr = strstr( start, "://" );
- if( ptr )
- {
- *ptr = '\0';
- ptr++;
- *ptr = '\0';
- ptr++;
- *ptr = '\0';
- ptr++;
- // Теперь ptr указывает на следующее поле
- start = ptr;
- if( strcasecmp( url, "http" ) == 0 )
- {
- *proto = PROTO_HTTP;
- result++;
- }
- else
- if( strcasecmp( url, "https" ) == 0 )
- {
- *proto = PROTO_HTTPS;
- result++;
- }
- }
- else
- {
- // Протокол вообще не указан - установм его в
- // протокол по умолчанию
- *proto = PROTO_HTTP;
- result++;
- }
- // Если первый этап по выделению типа протокола
- // завершился успешно, то перейдем ко второму этапу,
- // на котором выделим хост и порт
- if( result )
- {
- result = 0;
- // Работаем дальше, если нам есть что разбирать
- if( *start )
- {
- // ищем первый символ '/'
- ptr = strchr( start, '/' );
- if( ptr )
- {
- // Терминируем строку
- *ptr = '\0';
- // Все, что идет после '/' - это
- // данные URL (путь и аргументы)
- // Сохраним это
- ptr++;
- if( *ptr )
- {
- *url_path = ptr;
- }
- }
- // ищем, есть ли у нас порт
- ptr = strchr( start, ':' );
- if( ptr )
- {
- *ptr = '\0';
- *host = start;
- ptr++;
- if( *ptr )
- {
- // Преобразуем порт в число
- *port = strtoul( ptr,
- &start, 0 );
- // Удалось преобразовать
- // все цифры?
- if( *start == '\0' )
- {
- if( *port <= 0xFFFF )
- {
- result++;
- }
- }
- else
- {
- // Нам попытались
- // подсунуть мусор
- *port = 0;
- }
- }
- }
- else
- {
- // Порт не указан
- *host = start;
- *port = DEFAULT_PORT;
- result++;
- }
- }
- }
- // Разберем остаток URL
- if( *url_path )
- {
- ptr = strchr( *url_path, '?' );
- // Нашли разделитель?
- if( ptr )
- {
- *ptr = '\0';
- ptr++;
- *url_arg = ptr;
- }
- }
- }
- return result;
- }
- //-------------------------------------------------------------------
- int main( int argc, char* argv[] )
- {
- int result = 0;
- unsigned long proto;
- char* host;
- unsigned long port;
- char* url_path;
- char* url_arg;
- if( argc > 1 )
- {
- if( parse_url( argv[1], &proto, &host, &port,
- &url_path, &url_arg ) )
- {
- switch( proto )
- {
- case PROTO_HTTP:
- printf( "Протокол HTTP\n" );
- break;
- case PROTO_HTTPS:
- printf( "Протокол HTTPS\n" );
- break;
- default:
- printf( "Неизвестный протокол!\n" );
- }
- printf( "Хост: %s, Порт: %lu\n", host, port );
- if( url_path )
- {
- printf( "Путь: '%s'\n", url_path );
- }
- if( url_arg )
- {
- printf( "Параметры: '%s'\n", url_arg );
- }
- }
- else
- {
- printf( "Ошибка! Выявлен кривой URL!\n" );
- }
- }
- else
- {
- printf( "Использование: %s: <URL>\n", argv[ 0 ] );
- }
- return result;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement