Firefox уничтожает заголовок и добавляет случайные символы - PullRequest
1 голос
/ 27 марта 2012

У меня самая сумасшедшая проблема с Firefox. Я не уверен, исходит ли эта проблема от самого Firefox или от моего пользовательского веб-сервера (встроенного в Delphi) или от того, что это может быть. Эта проблема возникает только в Firefox (и Opera), когда он перемещает все от головы до тела, а также добавляет случайные символы в начале тела. Странно, но даже с полностью 100% пустой веб-страницей.

Я тестирую на такой простой странице:

<html>
<head>
    <title>Test</title>
</head>
<body>

</body>
</html>

Что касается веб-сервера, я создаю собственное приложение HTTP в Delphi, используя IdHTTPWebBrokerBridge (Indy) и просто заменяю ContentStream (или Content) Request, например, так ...

procedure TDashModule.DashConsoleHomeAction(Sender: TObject;
  Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
begin
  Response.ContentType:= 'text/html';
  Response.ContentStream:= TFileStream.Create('C:\SomeDir\SomeFile.html', fmOpenRead or fmShareDenyNone);
end;

... где SomeFile.html - пустая страница, опубликованная выше, а процедура - обработчик событий для обработчика запросов по умолчанию.

В Chrome, IE, Safari и т. Д. Все отображается в точности как исходный код. Тем не менее, Firefox (и Opera) производят это:

<html>
<head>
</head>
<body>

<title>Test</title>
</body>
</html>

Как видите, тег title был перемещен вниз до body, и некоторые случайные символы  появляются в самом начале тела. При просмотре необработанной страницы в виде исходного файла в Firefox она отображается правильно. Но при использовании моего веб-сервера в Delphi Firefox уничтожает эту страницу (и все страницы, если на то пошло).

Что может быть, и как это исправить?

Шаги для воспроизведения

A) Создайте новую HTML-страницу (для меня в Visual Studio 2010) только с таким содержимым:

<html>
<head>
    <title>Test</title>
</head>
<body>

</body>
</html>

B) В Delphi XE2 запустите новый проект: File > New > Other... > Web Broker > Web Server Application

C) Выберите Stand-alone VCL Application> Далее> Готово

D) Создайте обработчик по умолчанию (щелкните правой кнопкой мыши WebModule1 и выберите Action Editor...)

E) Для элемента DefaultHandler перейдите в Свойства события и перейдите к Обработчику событий для OnAction

F) Замените любой код, который уже существует, этим (замените имя файла на имя файла HTML):

Response.ContentStream:= TFileStream.Create('C:\SomeDir\SomeFile.html', fmOpenRead or fmShareDenyNone);

E) Запустите приложение и нажмите «Показать в браузере» - скопируйте / вставьте URL-адрес в Firefox, если необходимо.

UPDATE

Благодаря помощи я пришел к выводу, что проблема связана с тегом спецификации файла, который там не принадлежит. Это было связано с тем, как работает TFileStream, он загружает каждый маленький кусочек файла, который включает этот код. Вместо этого я изменил свой метод на использование TStringList.LoadFromFile(), потому что это автоматически обнаруживает его, и я также могу прочитать TStringList.Text, чтобы присвоить Response.Content.

Ответы [ 2 ]

7 голосов
/ 27 марта 2012

Очевидно эти три символа составляют Unicode UTF-8 Mark Byte-Order Mark .Предполагается, что они помещаются в начало файла, а не визуализируются;это метаданные, позволяющие текстовому интерпретатору знать используемую кодировку.Не знаю, почему вы видите его в середине вашего файла!Попробуйте открыть оригинал в шестнадцатеричном редакторе и посмотреть, встроена ли в него спецификация.

(Если у вас нет шестнадцатеричного редактора, вы можете получить очень хороший бесплатный здесь . Это даже написано на Delphi!)

2 голосов
/ 27 марта 2012

Эти 3 символа являются спецификацией UTF-8.Спецификация не должна быть там.Я не могу сказать, откуда это (возможно, это из файла), но вам нужно удалить его.

Ошибка, конечно, на вашем конце!Не обманывайтесь тем, что браузеры IE и Webkit отображают страницу нормально.Это просто означает, что эти браузеры снисходительны.

...