15.09.2010

Сніфінг на RSS 1.0 каналаў падаецца як тэкст/HTML

* Source text URL: http://blog.whatwg.org/content-sniffing-still-sucks

Нядаўна я знайшоў сябе праверку таго, як браўзары сніфяць для RSS 1.0 стужкі, якія падаюцца з няправільным тыпам MIME. (Так, маё жыццё поўна смачнай іроніяй.) Я падумаў падзяліцца сваімі высновамі дагэтуль.

Firefox

Алгарытм сніфінга канала Firefox размешчаны ў nsFeedSniffer.cpp. Як вы можаце бачыць, пачынальна з лініі 353, ён займае першыя 512 байт на гэтай старонцы, шукае каранёвы тэг, які завецца rss (на RSS 2.0), atom (для Atom 0,3 і 1,0), ці rdf:RDF (для RSS 1.0 ). RSS 1.0 маркер, насамрэч, агульны маркер RDF, так што тады некаторыя дадатковыя праверкі на дзве патрэбныя прасторы імёнаў у RSS 1,0 корм, http://www.w3.org/1999/02/22-rdf-syntax-ns# і http://purl.org/rss/1.0/. Гэта праверка вельмі простая, яна літаральна праверкі на наяўнасць абодвух радкоў, не клапоцячыся, ці з’яўляюцца яны значэннем xmlns атрыбуту (ці нават якога-небудзь атрыбуту на ўсіх).

Firefox мае дадатковую функцыю, якая спатыкнула маё тэставанне, пакуль я не зразумеў. IE і Safari абодва маюць рэжым, у якім яны першым чынам кажуць: “Я выявіў гэту старонку ў якасці каналу і паспрабаваў разабраць яго, але ў мяне не атрымалася, так што зараз я адмовіўся”, і вось паведамленне пра памылку павінна паказвацца, чаму “я адмовіўся”. Firefox не падабаецца гэты рэжым. Наколькі я магу сказаць, калі гэта вырашае, што рэсурс – канал, але тады не атрымоўваецца прааналізаваць рэсурс, як канал, гэта паўторна аналізуе рэсурс з адключанай апрацоўкай канала. Такім чынам, няправільна пабудаваны канал служыць application/rss + xml, і фактычна ініцыюе дыялогавае вакно "Загрузіць гэты файл", таму што Firefox паспрабаваў прааналізаваць яго як канал, адмовіў, затым паўторна прааналізаваў яго, паколькі некаторыя выпадковыя носьбіты ўводзяць гэта, і я не апрацоўваю. Няправільна пабудаваны канал служыць тэкстам/HTML, фактычна прадстаўленым як HTML, але толькі пасля таго, як Firefox ціха спрабуе (і ў збоі) прааналізаваць яго як канал..

Там няма нічога дрэннага ў гэтым падыходзе, сапраўды, здаецца, значна больш ў выніку дружалюбных карыстачоў, чым пры выскокванні паведамленняў незразумелых памылак. Я проста жадаю адзначыць гэта, паколькі гэта спатыкнула мяне ў падчас тэставання.

Internet Explorer

Алгарытм сніфінга канала Internet Explorer задакументаваны камандай RSS Windows. Аб RSS 1.0 гэта сцвярджае:

IE7 выяўляе RSS 1.0 канал, выкарыстоўваючы тыпы кантэнту application/xml ці text/xml …. Дакумент правераны на радкі <rdf: rdf, http: = "" www.w3.org = "" 1999 = "" 02 = "" 22-rdf-syntax-ns # = "" і = "" purl.org = ""rss =" "1.0 =" ". =" "ie7 =" "выяўляе, =" "што =" "гэта =" "- =" "канал, =" "калі =" "усё =" "тры =" "радкі =" "знойдзеныя =" "у =" "першых =" "512 =" "байтах =" "дакумента …. =" "таксама =" "падтрымлівае =" "іншыя =" "універсальныя =" "Тыпы = "" кантэнту, = "" правяраючы = "" дакумент = "" на = "" пэўны = "" atom = "" rss. <br="">
Цяпер, калі я разумею алгарытм IE, я павінен прызнаць, што гэтая дакументацыя на 100% дакладная. Аднак, гэта не распавядае поўную гісторыю. Вось тое, што фактычна адбываецца, Калі Content-Type з’яўляецца
application/xml
text/xml
application/octet-stream
text/plain
text/html
гэта пусты радок ці
наогул адсутнічае

… … тады IE иніцыюе свой сніфінг канал. Пасля IE запускае свой сніфінг канал, ён ніколі не зменіць сваю пазіцыю (у адрозненне ад Firefox). Калі разбор каналу не атрымоўваецца, IE будзе кідаць паведамленне пра памылку са спасылкамі на каналы памылкі ў кодзе ці непадтрымоўваны фармат канала. Наяўнасць ці адсутнасць charset параметру Content-Type загалоўка абсалютна ніякай розніцы не маюць ні ў адным з выпадкаў, якія я тэставаў.

І як менавіта IE выявіць RSS 1,0 канал, калі ён вырашае сніфіць? Дакументацыі на MSDN літаральна так: “Гэты дакумент правяраецца на наяўнасць радка <rdf:RDF, http://www.w3.org/1999/02/22-rdf-syntax-ns# і http://purl.org/rss/1.0/. IE7 выяўляе, што гэта канал, калі ўсе тры радкі знаходзяцца ў межах першых 512 байт дакумента “. У спалучэнні з нашымі ведамі, у якіх Content-Type з IE лічаць “агульнымі”, мы можам скласці, што на наступнай старонцы службовыя text/html будуць разглядацца ў якасці корму ў IE:
<!– <rdf:RDF –>

<!– http://www.w3.org/1999/02/22-rdf-syntax-ns# –>

<!– http://purl.org/rss/1.0/ –>

<script>alert(‘Hi!’);</script>

Навошта турбавацца?

Я працую з Адамам Бартом і Янам Хіксонам, каб абнавіць праект draft-abarth-mime-sniff-01 (алгарытм сніфінга кантэнту, на які спасылаецца HTML5), каб удыхнуць RSS 1.0 канал службовым тэкстам/HTML. Малаверагодна, што мы будзем прымаць алгарытм IE, бо ён здаецца залішне паталагічным. Я прапаную наступныя змены, якія прынясуць кантэнт сніфінг спецыфікацыі ў адпаведнасці з алгарытмам сніфінга ў Firefox:

У Feed ці HTML прапануе выказаць наступныя крокі паміж крокам -10 і 11 крок:

10a. Ініцыялізацыя /RDF flag/ у 0.

10b. Ініцыялізацыя /RSS flag/ у 0.

10c. Калі кропкі с пазіцыяй pos у pos+23 роўныя у 0×68, 0×74, 0×74, 0×70, 0x3A, 0x2F, 0x2F, 0×70, 0×75, 0×72, 0x6C, 0x2E, 0x6F, 0×72, 0×67, 0x2F, 0×72, 0×73, 0×73, 0x2F, 0×31, 0x2E, 0×30, 0x2F суадносна (ASCII for “http://purl.org/rss/1.0/”), тады:
Павял. pos да 23.
Вуснаў /RSS flag/ у 1.

10d.Калі кропкі з пазіцыяй pos у pos+42 у s роўыня 0×68, 0×74, 0×74, 0×70, 0x3A, 0x2F, 0x2F, 0×77, 0×77, 0×77, 0x2E, 0×77, 0×33, 0x2E, 0x6F, 0×72, 0×67, 0x2F, 0×31, 0×39, 0×39, 0×39, 0x2F, 0×30, 0×32, 0x2F, 0×32, 0×32, 0x2D, 0×72, 0×64, 0×66, 0x2D, 0×73, 0×79, 0x6E, 0×74, 0×61, 0×78, 0x2D, 0x6E, 0×73, 0×23 суадносна (ASCII для “http://www.w3.org/1999/02/22-rdf-syntax-ns #”), то:
Павял. pos да 42.
Вуснаў. /RDF flag/ у 1.

10e. Павелічэнне pos да 1.

10f. Калі /RDF flag/ роўна 1, і /RSS flag/ роўна 1, тады /sniffed type/ роўны “application/rss+xml”. Перапыніце гэтыя крокі.

10g. Калі пазіцыя кропкі пасля канчатка са струменем s, а затым працягнуць крокам 11 гэтага алгарытму.

10h. Зрабіце крок назад 10c у алгарытме.
Дадатковая літаратура

Вы можаце бачыць вынікі сваіх даследаванняў на сённяшні дзень і праверыць каналы для сябе. Таму што мае вынікі даследавання звычайнага тэксту з убудаваным HTML тэгам, я дадаў 512 байт вядучых прабелыў на старонку, каб сарваць звычайны тэксту ці HTML-змесціва браўзара сніфінгам. Мммм – смачная, смачная іронія.

ok ok