1. PHP / Говнокод #29161

    +1

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    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, 25 Июля 2025

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

    • SEO-псто.

      Метки: #cloudflare #roskomgovno #ranges #php.
      Ответить
    • К слову, я не понимаю, почему в стандартной библиотеке нету функции real_parse_headers, и мне пришлось её писать.

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

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

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

          десяточку будешь?
          Ответить
    • >real_copy
      ахахах
      Ответить
      • Что смешного?
        Ответить
        • мне кажется он накруился просто, вот ему и смешно
          Ответить
      • Ну это же реальный пример реализации алгоритма принципа мухи: программа смотрит на удалённый ресурс фасетками, как муха, а потом собирает файл из частей.
        Ответить
    • Давайте вспоминать, сколькими способами можно сделать 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/C++ нет поддержки сети.

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

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

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

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


            ну то-есть курлы не надо как-бы на самом-то деле (behalve прыщей конечно)
            Ответить
            • А ведь WinInet можно даже из скриптушни дёрнуть через FFI...
              Ответить
              • dat kan.

                я почитал, кстати: WinInet для десктопных прилолежний, WinHttp для сервисов
                https://learn.microsoft.com/en-us/windows/win32/wininet/wininet-vs-winhttp
                Ответить
        • В Qt всё есть, но Qt не C++
          Ответить
    • Интернет в 00-е: ослик и аутлук и вся сеть у твоих рукк
      Интернет в 20-е: телеграм, многотонные браузеры, goodbye-dpi, vpn, proxy... —Гражданин, пройдёмте в отделение. — Но я ведь только смотрел ютуб!?
      Ответить
      • Теперь тебя забанит фейсбук за оскорбление геев, потом роскомназдор забанит тебе сам фейсбук, а потом товарищ майор арестует тебя за пропаганду ЛГБТ в запрещенной сети фейсбук

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

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

            А у вас RSS читалки платной нету случайно?
            А сколько стоит завести в интернете электронную почиту?
            Ответить
            • Если реализуют Чебурнет, всё станет платным, ибо монополист может себе позволить быть охуевшей мразью.
              Ответить
    • о пользе кобыл
      https://pbs.twimg.com/media/Gwr4e1NXkAAG2fV?format=jpg&name=medium
      Ответить
      • А о пользе жаб нету картинки?
        Ответить
        • Всегда ношу с собой жабу на случай встречи с гадюкой
          Ответить
    • StackOverflow should have been called StackOverweight
      https://i.postimg.cc/W46t11Lf/image.png
      Ответить

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