
Проверка доступности URL на Ассемблере

Проверка доступности URL на Ассемблере
Понадобилась функция проверки доступности определенного URL. Под доступностью я понимаю успешное соединение с сервером и получение от него корректного ответа с кодом 200. Дополнительно к проверке доступности я сделал возможность запрашивать размер файла по ссылке без скачивания самого файла.
Функция проверки получилась следующая. Два обязательных параметра: lpURL - указатель на строку URL в формате ASCIIZ, который надо проверить на доступность и dGetSize - надо ли запрашивать размер файла по ссылке или только проверить доступность.
Code (Assembler) : Убрать нумерацию
- ;----------------------------------------------------------------------
- ; Функция для проверки доступности URL
- ;----------------------------------------------------------------------
- ; Параметры:
- ; lpURL - указатель на строку ASCIIZ проверяемого URL
- ; dGetSize - сразу запрашивать размер данных (TRUE/FALSE)
- ; На выходе:
- ; EAX = -1 - ссылка недоступна или нет соединения
- ; EAX = 1 - если ссылка доступна и dGetSize = FALSE
- ; EAX = размер данных, если ссылка доступна и dGetSize = TRUE
- ;----------------------------------------------------------------------
- proc is_valid_url lpURL:DWORD, dGetSize:DWORD
- INTERNET_OPEN_TYPE_PRECONFIG = 0x00000000
- INTERNET_FLAG_NO_UI = 0x00000200
- HTTP_QUERY_STATUS_CODE = 0x00000013
- HTTP_QUERY_CONTENT_TYPE = 0x00000001
- HTTP_QUERY_CONTENT_LENGTH = 0x00000005
- HTTP_QUERY_FLAG_NUMBER = 0x20000000
- BUFF_LENGTH = 100h
- locals
- result dd ?
- hInet dd ?
- dummy dd ?
- buff_len dd ?
- buff rb BUFF_LENGTH
- endl
- ; Сохранить все регистры
- pusha
- ; По умолчанию все плохо
- mov [result],-1
- ; Открыть соединение
- invoke InternetOpen,NULL,INTERNET_OPEN_TYPE_PRECONFIG,NULL,NULL,0
- or eax,eax
- jz .loc_ret
- ; Положить Handle на стек
- push eax
- ; Запросить соединение с URL
- invoke InternetOpenUrl,eax,[lpURL],NULL,0,INTERNET_FLAG_NO_UI,0
- or eax,eax
- jz .loc_close_hinet
- mov ebx,eax
- ; Размер буфера для приема данных
- mov [buff_len],BUFF_LENGTH
- ; Получить код состояния HTTP
- lea eax,[dummy]
- push eax
- lea eax,[buff_len]
- push eax
- lea eax,[buff]
- push eax
- invoke HttpQueryInfo,ebx,\
- HTTP_QUERY_STATUS_CODE+HTTP_QUERY_FLAG_NUMBER
- or eax,eax
- jz .loc_close_hconnection
- ; Код состояния = 200 (OK)?
- lea eax,[buff]
- cmp dword [eax],200
- jne .loc_close_hconnection
- ; Надо ли сразу запрашивать размер данных?
- cmp [dGetSize],TRUE
- jz @f
- ; Ссылка просто доступна
- mov [result],1
- jmp .loc_close_hconnection
- @@:
- ; Получить размер возвращаемого контента
- lea eax,[dummy]
- push eax
- lea eax,[buff_len]
- push eax
- lea eax,[buff]
- push eax
- invoke HttpQueryInfo,ebx,\
- HTTP_QUERY_CONTENT_LENGTH+HTTP_QUERY_FLAG_NUMBER
- or eax,eax
- jz .loc_close_hconnection
- ; Размер контента
- lea eax,[buff]
- mov eax,[eax]
- mov [result],eax
- .loc_close_hconnection:
- invoke InternetCloseHandle,ebx
- .loc_close_hinet:
- ; Handle на стеке
- invoke InternetCloseHandle
- .loc_ret:
- ; Восстановить все регистры
- popa
- ; Вернуть результат в регистре EAX
- mov eax,[result]
- ret
- endp
Code (Assembler) : Убрать нумерацию
- ; Проверить доступность ссылки и получить размер контента
- stdcall is_valid_url,url,TRUE
- ; Просто проверить доступность ссылки
- stdcall is_valid_url,url,FALSE
Просмотров: 1960 | Комментариев: 3

Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье

ManHunter
(10.10.2016 в 22:24):
Что сервер в заголовках отдал - то функция и показала. Динамический размер, естественно, кроме как полной загрузкой, никаким образом не получить.

zdm
(10.10.2016 в 21:05):
Но ведь запрос размера будет работать только с теми страницами которые возвращают "Content-Length: xxx". Т.к. сайты сейчас динамические это поле почти никогда не возвращается. Верно?

Добавить комментарий
Заполните форму для добавления комментария

снифер показывает 404 для оперы
для исходника 200 ок