- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
<?php
function real_parse_headers($data) {
$result = [];
foreach($data as $line) {
$parts = explode(':', $line, 2);
if(!isset($parts[1])) continue;
$key = trim($parts[0]);
$key = implode('-', array_map(function($value) {return ucfirst($value);}, explode('-', $key)));
$result[$key] = trim($parts[1]);
}
return $result;
}
function real_length($from, $original_context = null) {
$context = stream_context_create(isset($original_context) ? stream_context_get_options($original_context) : null);
stream_context_set_option($context, 'http', 'method', 'HEAD');
@file_get_contents($from, false, $context);
return intval(real_parse_headers($http_response_header)['Content-Length']);
}
function real_copy($from, string $to, $context = null) {
define('BLOCK', 8192);
$total = real_length($from, $context);
if(!isset($context)) {
$context = stream_context_create();
}
$headers = stream_context_get_options($context)['http']['header'] ?? [];
stream_context_set_option($context, 'http', 'timeout', '1.0');
stream_context_set_option($context, 'http', 'ignore_errors', true);
for($start = 0; $start < $total; $start += $length) {
$end = $start + BLOCK;
stream_context_set_option($context, 'http', 'header', array_merge($headers, ["Range: bytes=$start-$end"]));
$part = @file_get_contents($from, false, $context);
if($part === false) break;
$length = strlen($part);
file_put_contents($to, $part, FILE_APPEND);
}
}
/* The real example */
$context = stream_context_create([
'http' => ['method' => 'GET'],
'ssl' => ['verify_peer' => false, 'verify_peer_name' => false, 'allow_self_signed' => true, 'SNI_enabled' => true]
]);
real_copy('https://govnokod.ru/files/images/pony.jpg', 'pony.jpg', $context);
Дрочилка для скачивания файлов с сайтов, расположенных за «Cloudflare». Теперь банановая и на «PHP»!
Метки: #cloudflare #roskomgovno #ranges #php.
Вообще можно было и без неё: просто завершать цикл, когда скачано ноль байтов, но я решил убедиться, что весь файл скачан.
Ещё можно было через курлы-курлы, но писанины было бы больше.
Если в Range: не указывать верхнюю границу, качает блоками по 14,5 килобайт (16К минус заголовки).
— Кто тут сказал про режим?
— Говорю, холод невыносимый!
— Врёте! Холод выносимый. Если невыносимый, то режим.
десяточку будешь?
ахахах
1. Любой функцией, у которой есть параметр $context и которая умеет использовать «врапперы», например, file_get_contents.
2. Курлы-курлы.
3. Расширение http, лежащее в PECL. У него, кстати, две или три несовместимые линейки версий. Сейчас уже, кажется, забыто.
4. PEAR/HTTP_Request, HTTP_Request2. Эти же пакеты сейчас лежат в Composer.
5. Для настоящих извращенцев: соединиться через сокет и вручную слать и получать заголовки. Если ещё нужна поддержка TLS, вечер перестанет быть томным.
6. Через фреймворки. Что-то типа Zend\Http\Client.
Либо непортабельно, средствами ОС, либо через библиотеки наподобие курлы-курлы.
Подозреваю, что в итоге получится ещё больше способов.
И мне помница смуктно, что в яблоке тоже бы надо `URLSession` (или хай помнит как оно ща называется) потому что там тоже есть центральные настройки и core network.
Альзо, это всё уважит твои CA сертификаты еще
ну то-есть курлы не надо как-бы на самом-то деле (behalve прыщей конечно)
я почитал, кстати: WinInet для десктопных прилолежний, WinHttp для сервисов
https://learn.microsoft.com/en-us/windows/win32/wininet/wininet-vs-winhttp
Интернет в 20-е: телеграм, многотонные браузеры, goodbye-dpi, vpn, proxy... —Гражданин, пройдёмте в отделение. — Но я ведь только смотрел ютуб!?
Интернет это свобода!
Разумеется, в строгом соответствии с законами РФ
The Bat и Opera!
https://www.ritlabs.com/en/products/thebat/order.php
А у вас RSS читалки платной нету случайно?
А сколько стоит завести в интернете электронную почиту?
https://pbs.twimg.com/media/Gwr4e1NXkAAG2fV?format=jpg&name=medium