1. Pascal / Говнокод #26290

    0

    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
    procedure TForm1.IdHTTPServer1CommandGet(AContext: TIdContext;
      ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
      var
        http:tidhttp;
        ss:tstringstream;
      begin
      try
        http:=tidhttp.Create(nil);
        http.CookieManager:=tIdcookiemanager.Create(nil);
        http.HandleRedirects:=true;
        http.AllowCookies:=True;
        http.Request.UserAgent:='Mozilla/5.0 (Windows NT 6.1; rv:56.0) Gecko/20100101 Firefox/56.0';
        http.IOHandler:=tidssliohandlersocketopenssl.Create(nil);
        http.Compressor:=tidcompressorzlib.Create(nil);
        http.Request.Accept:='text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8';
        http.Request.AcceptEncoding:='gzip, deflate';
        SS:=tstringstream.Create;
        HTTP.Get(ARequestInfo.URI, SS);
        aresponseinfo.CharSet:=http.Response.CharSet;
        aresponseinfo.ContentType:=http.Response.ContentType+'; '+'charset='+http.Response.CharSet+';';
        aresponseinfo.ContentStream:=SS;
        AResponseInfo.WriteContent;
      except
    
      end;
    
    
    end;

    Мой разложившийся мозг сопротивляется. Сковзь пелену галлюцинаций, где где меня имеют сразу несколько волосатых таджиков, отчетливо пробивается реклама. Ее много. Очень много. Реклама и навязчивые видео с предложениями "срубить бабла" даже страшнее галлюцинаций. Я написал простой фильтр, заключающийся в локальном сервере, к которому я подключаюсь из браузера. Сервер является точкой доступа. Неугодные запросы я буду отпиздовывать на корню.
    Собственно, этот код я запостил как фикс досадного гълюка, заключающегося в том, что браузер посылает нахой поле charset. Это херит даже код html.
    Кодировку следует указывать в поле "КонтентТипе"

    пожалуй, всё. пока.

    Запостил: AnalBoy, 30 Декабря 2019

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

    • Так я не понял, в чём говно?
      Ответить
      • Он использует программу, написанную на «Delphi» с применением библиотеки «Indy» в качестве прокси-сервера. Вот описание этого монстра:
        https://ru.wikipedia.org/wiki/Internet_Direct

        Если я правильно понял, то «Indy» в качестве клиента разбирает пришедший от сервера заголовок «Content-Type: text/html; charset=utf-8» на поля aresponseinfo.CharSet (в нём в данном примере будет лежать «utf-8») и aresponseinfo.ContentType (в нём будет лежать мимими-тип без чарсета).

        «Indy» же в качестве сервера обратно собрать комбинированный «Content-Type» не может. Он отправляет клиенту заголовок «Content-Type», составленный исключительно из aresponseinfo.ContentType (например, «Content-Type: text/html»). Чтобы отправить чарсет, нужно составить комбинированный заголовок самостоятельно, как в этом примере:
        aresponseinfo.ContentType:=http.Response.ContentType+'; '+'charset='+http.Response.CharSet+';';
        Ответить
        • А как ты понял, что это "Indy"?
          Ответить
          • По топикстартеру.

            А буквы «ID» в названиях классов подтвердили догадку.
            Ответить
            • Ладно, пока поверим на слово. Но помни, я за тобой слижу.
              Ответить
          • Вот тут по идее должно добавлять (только почему-то слово CHARSET заглавными, да ещё и сам чарсет в кавычках):
            unit IdText;
            ...
            const
              SContentType = '%s; CHARSET="%s"';  {do not localize}
            ...
            procedure TIdText.SetContentType(const AValue: string);
            begin
              inherited SetContentType(Format(SContentType, [AValue,GetCharSet(Headers.Values['Content-Type'])]));  {do not localize}
            end;


            В RFC2616 же такое определение:
            charset = token
            И пример:
            Content-Type: text/html; charset=ISO-8859-4

            Значит, «Indy» отправляет чарсет, но в кавычках, и именно из-за кавычек браузеры не могут его распознать.

            Какой анскилл )))

            До кучи: в «Indy» наследование реализации во все поля. Слово «inherited» (вызов неявного родителя) чуть ли не в каждом методе. Голову сломаешь, пока разберёшься, код из предка какого поколения реально используется в методе.
            Ответить
      • В том, что ты уебок.
        Ответить
        • Каюсь, тоже поддержал дискуссию. Но зрелище уж больно байтораздирающее, не смог пройти мимо.
          Ответить
        • Нормальный же пост.
          Ответить
    • Орнул с формошлепской венгерки
      Ответить

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