"PHP" / Говнокод #29161 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14
  15. 15
  16. 16
  17. 17
  18. 18
  19. 19
  20. 20
  21. 21
  22. 22
  23. 23
  24. 24
  25. 25
  26. 26
  27. 27
  28. 28
  29. 29
  30. 30
  31. 31
  32. 32
  33. 33
  34. 34
  35. 35
  36. 36
  37. 37
  38. 38
  39. 39
  40. 40
  41. 41
  42. 42
  43. 43
  44. 44
  45. 45
  46. 46
  47. 47
  48. 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»!

Запостил: nemyx nemyx, (Updated )

Комментарии (28) RSS

  • К слову, я не понимаю, почему в стандартной библиотеке нету функции real_parse_headers, и мне пришлось её писать.

    Вообще можно было и без неё: просто завершать цикл, когда скачано ноль байтов, но я решил убедиться, что весь файл скачан.

    Ещё можно было через курлы-курлы, но писанины было бы больше.

    Если в Range: не указывать верхнюю границу, качает блоками по 14,5 килобайт (16К минус заголовки).
    Ответить
  • Дроны атаковали город Невыносимск
    Ответить
    • — Невыносимо!
      — Кто тут сказал про режим?
      — Говорю, холод невыносимый!
      — Врёте! Холод выносимый. Если невыносимый, то режим.
      Ответить
      • > невыносимый, то режим.

        десяточку будешь?
        Ответить
      • мне кажется он накруился просто, вот ему и смешно
        Ответить
    • Ну это же реальный пример реализации алгоритма принципа мухи: программа смотрит на удалённый ресурс фасетками, как муха, а потом собирает файл из частей.
      Ответить
  • Давайте вспоминать, сколькими способами можно сделать HTTP-запрос в «PHP»:

    1. Любой функцией, у которой есть параметр $context и которая умеет использовать «врапперы», например, file_get_contents.

    2. Курлы-курлы.

    3. Расширение http, лежащее в PECL. У него, кстати, две или три несовместимые линейки версий. Сейчас уже, кажется, забыто.

    4. PEAR/HTTP_Request, HTTP_Request2. Эти же пакеты сейчас лежат в Composer.

    5. Для настоящих извращенцев: соединиться через сокет и вручную слать и получать заголовки. Если ещё нужна поддержка TLS, вечер перестанет быть томным.

    6. Через фреймворки. Что-то типа Zend\Http\Client.
    Ответить
      • В C/C++ нет поддержки сети.

        Либо непортабельно, средствами ОС, либо через библиотеки наподобие курлы-курлы.

        Подозреваю, что в итоге получится ещё больше способов.
        Ответить
        • Причем например на сперме идеологически верно это делать через API операционки через WinHttp (илиWinINet , я их тупаю) потому что ты получишь прокси (along with winpad), автозапуск удаленной сети (VPN, дайлап, и пр)

          И мне помница смуктно, что в яблоке тоже бы надо `URLSession` (или хай помнит как оно ща называется) потому что там тоже есть центральные настройки и core network.

          Альзо, это всё уважит твои CA сертификаты еще


          ну то-есть курлы не надо как-бы на самом-то деле (behalve прыщей конечно)
          Ответить
  • Интернет в 00-е: ослик и аутлук и вся сеть у твоих рукк
    Интернет в 20-е: телеграм, многотонные браузеры, goodbye-dpi, vpn, proxy... —Гражданин, пройдёмте в отделение. — Но я ведь только смотрел ютуб!?
    Ответить
    • Теперь тебя забанит фейсбук за оскорбление геев, потом роскомназдор забанит тебе сам фейсбук, а потом товарищ майор арестует тебя за пропаганду ЛГБТ в запрещенной сети фейсбук

      Интернет это свобода!
      Ответить
      • Я не удивлюсь, если Фейсбук выдаст товарищу майору всю известную ему о тебе информацию.
        Разумеется, в строгом соответствии с законами РФ
        Ответить
      • конечно. Какой аутлук? Какой ослик?
        The Bat и Opera!
        Ответить
        • поверить не могу: они продают десктопный почтовый клиент в 2025-м году

          https://www.ritlabs.com/en/products/thebat/order.php

          А у вас RSS читалки платной нету случайно?
          А сколько стоит завести в интернете электронную почиту?
          Ответить
          • Если реализуют Чебурнет, всё станет платным, ибо монополист может себе позволить быть охуевшей мразью.
            Ответить
      • Всегда ношу с собой жабу на случай встречи с гадюкой
        Ответить

Добавить комментарий

Я, guest, находясь в здравом уме и твердой памяти, торжественно заявляю:

    А не использовать ли нам bbcode?


    8