(.*?)\#~\#){2}(?>\Q]] .. hc.url .. [[\E|\Q]] .. hc.url:gsub('^http', 'https', 1) .. [[\E)]], 1), 'wb', CMBODY)
process_update(re.replace(UpdateList, [[\#~\#(?>\Q]] .. hc.url .. [[\E|\Q]] .. hc.url:gsub('^http', 'https', 1) .. [[\E)\K(?=\s|\z)]], '#~#1'))
end
CMBODY, CFGBODY = nil
end
return
end
local mindex = hc.monitor_index
_CM_CURRENT_REQUEST_DATA = _CM_DATA[mindex]
if _CM_CURRENT_REQUEST_DATA.UnregisterBeforeAnswerBodySend then return end -- обработчик "отключен"
-- clck2 = clck2 - os.clock()
local new_body, partial = hc.answer_body, not hc.last_part and 'hard' or nil
-- hc.put_to_log('HTML_Worker:Process: ', hc.url, '\r\nпоступил фрагмент длиной ', #new_body, partial and '' or ' (последний)')
if _CM_CURRENT_REQUEST_DATA.FirstChunk then -- если это первый чанк ответа
-- иногда Content-Type заголовка ответа содержит text/html, однако на самом деле ответ не является HTML
-- СМ пытается угадать действительный тип контента. По мере получения примеров список может расширяться
if re.find(new_body, [[\A(?:\xEF\xBB\xBF)?+(?>\s++|/\*.*?\*/)*+[;(\s]*+(?>document\.write|function|var\s|{"\w++":)]])
and _CM_CURRENT_REQUEST_DATA.ContentTypeByHeader ~= 'application/json' -- JSON имеет формат JS
then _CM_CURRENT_REQUEST_DATA.ContentTypeByBody = 'js' -- это JavaScript (пример: http://www.nix.ru/include/general.js и почти все остальные скрипты, грузимые с http://www.nix.ru/price/price_list.html?section=computers_nix_all
elseif _CM_CURRENT_REQUEST_DATA.ContentTypeByHeader=='html' and not new_body:match('<%w') then
_CM_CURRENT_REQUEST_DATA.ContentTypeByBody = 'unknown' -- это не HTML (http://gsioutdoors.com/request/pdp_sized_images/65101_h1_f)
else -- пытаемся определить тип содержимого по сигнатуре файла
-- справочник сигнатур: http://www.garykessler.net/library/file_sigs.html
-- справочник MIME-типов: http://svn.apache.org/viewvc/httpd/httpd/branches/2.2.x/docs/conf/mime.types?view=annotate
local signatures = {
['\x89\x50\x4E\x47\x0D\x0A\x1A\x0A'] = 'image/png', -- http://morevariantov.ru/bitrix/components/edit_components/catalog/saleimg.php?src=/upload/iblock/53e/53ec3527f8131cf415d925139dc36f23.jpeg&template=/bitrix_personal/templates/morevar
['\xFF\xD8\xFF'] = 'image/jpeg', -- http://zyxel.ru/sites/default/files/catalogue/logo_sky.htm
['\x00\x01\x00\x00\x00'] = 'application/x-font-ttf', -- http://vongomedia.ru/assets/fonts/MtBoCyLI.ttf
['\x77\x4F\x46\x46'] = 'application/x-font-woff ', -- http://vongomedia.ru/assets/fonts/MtBoCyLI.woff
['\x50\x4B\x03\x04'] = 'application/zip', -- http://www.packtpub.com/code_download/11704
['\x00\x00\x00\x18\x66\x74\x79\x70'] = 'video/mp4', -- http://s5.kinostok.tv/flv/e1b55b8b193c88cb94d91fa5e5ae7a67/uploaded_video/video/30/3054/305409/305409.mp4
}
for signature, mime in pairs(signatures) do
if new_body:sub(1, #signature)==signature then
_CM_CURRENT_REQUEST_DATA.ContentTypeByBody = mime
break
end
end
end
_CM_CURRENT_REQUEST_DATA.ContentType = _CM_CURRENT_REQUEST_DATA.ContentTypeByBody or _CM_CURRENT_REQUEST_DATA.ContentTypeByHeader
if _CM_CURRENT_REQUEST_DATA.ContentType=='html' and not _CM_CURRENT_REQUEST_DATA.CharsetByHeader then -- это html с необъявленным чарсетом. Попытаемся установить его сами. Если не получится, полагаем, что это 'iso-8859-1'
-- более крутой алгоритм определения: http://www-archive.mozilla.org/projects/intl/UniversalCharsetDetection.html
local charset = new_body:match('' .. _CM_CURRENT_REQUEST_DATA.LogFragment .. '
'
_CM_WRITE_FILE(_CM_DIR .. 'ContentMasterLog.html', 'ab', _CM_CURRENT_REQUEST_DATA.LogFragment)
end
if _CM_CURRENT_REQUEST_DATA.Worker and _CM_CURRENT_REQUEST_DATA.ContentType=='html' and _CM_CURRENT_REQUEST_DATA.InteractiveModeOn then -- если интерактивный режим включен, то добавляем на страницу CSS и JS, обеспечивающие его работу
new_body = new_body .. '\r\n\r\n'
hc.set_global_table_item('CM_DOMS', tostring(mindex), _CM_SAVE_TABLE(_CM_CURRENT_REQUEST_DATA.Worker.document))
end
_CM_DATA[mindex], _CM_CURRENT_REQUEST_DATA = nil, nil -- очищаем глобальные переменные
-- local cld = clck1
-- clck1 = clck1 + os.clock()
-- hc.put_to_log('Content Master: статистика загрузки страницы ', hc.url, string.format(
-- '\r\nВремя обработки страницы СМ = %g сек\r\nИз него обработчиком HTML = %g' ..
-- '\r\n' .. string.rep('-', 40) .. ' в том числе: ' .. string.rep('-', 40) ..
-- '\r\n Замена текста = %g' ..
-- '\r\n Построение DOM = %g' ..
-- '\r\n Вырез. по прямому указанию пользователя = %g' ..
-- '\r\n Вырез. по обрамляющему комментарию = %g' ..
-- '\r\n Вырез. по содержанию стартового тэга = %g' ..
-- '\r\n Вырез. в CSS = %g' ..
-- '\r\n Вырез. в JS = %g' ..
-- '\r\n Вырез. по содержащемуся тексту = %g', clck1, clck2, clck6, clck5, clck8, clck7, clck3, clck9, clck10, clck4))
-- if clck1<0 then hc.put_msg(hc.url, '\r\nclck1<0') hc.put_to_log(cld, '\r\n', clck1) end
end
-- hc.put_to_log('_CM_HTML_WORKER:Process: ', hc.url, '\r\nОТДАН фрагмент длиной ', #new_body, not hc.last_part and '' or ' (последний)', '\r\nНачало = ', new_body:sub(1,200), '\r\nКонец = ', new_body:sub(-200))
hc.answer_body = new_body
-- collectgarbage()
-- hc.put_to_log('------------ BeforeAnswerBodySend ENDS -----------\r\n', clck1)
end