Школоло / Говнокод #26290 Ссылка на оригинал

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
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 AnalBoy, (Updated )

Комментарии (12) 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+';';
      Ответить
        • По топикстартеру.

          А буквы «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» (вызов неявного родителя) чуть ли не в каждом методе. Голову сломаешь, пока разберёшься, код из предка какого поколения реально используется в методе.
          Ответить

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

Помни, guest, за тобой могут следить!

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


    8