+  HandyCache форум
|-+  Главная категория» Общие вопросы» 403 заменить на свою
Имя пользователя:
Пароль:
Страниц: [1]   Вниз
  Отправить эту тему    Печать  
Автор Тема: 403 заменить на свою  (Прочитано 8748 раз)
0 Пользователей и 1 Гость смотрят эту тему.
DIGGER
Старожил
****

Репутация: +14/-3
Offline Offline

Сообщений: 312



« : 25 декабря 2010, 17:23:36 »

Нужно заменить страничку ответа 403 на свою. Как быть? Если HC не умеет, то можно расширение написать?
Я так думаю писать для HC такого рода расширение не трудно, но я не в теме, может кто подсказать общий шаблон?
Сообщить модератору   Записан
mai62
Автор HC
*****

Репутация: +226/-4
Offline Offline

Сообщений: 6383


« Ответ #1 : 25 декабря 2010, 23:10:20 »

Можно заменить через расширение.
В расширении сделать обработчик события BeforeAnswerHeaderSend. Из переменной hc.answer_header получить заголовок ответа. Посмотреть на него и решить менять ответ или нет. Если надо менять, то переменной hc.answer_header присвоить новый заголовок. Тело ответа можно присвоить переменной hc.answer_body. Подробнее про эти переменные можно прочитать в файле HCExtensions.html (лежит в архиве с дистрибутивом НС).
Сообщить модератору   Записан
DIGGER
Старожил
****

Репутация: +14/-3
Offline Offline

Сообщений: 312



« Ответ #2 : 26 декабря 2010, 02:27:16 »

Спасибо, будем терзать Улыбка

Upd:
LuaTest.exe : "Access violation at address 00000000. Read of address 00000000."
Куда копать?  Help me!
« Последнее редактирование: 26 декабря 2010, 03:04:11 от DIGGER » Сообщить модератору   Записан
DIGGER
Старожил
****

Репутация: +14/-3
Offline Offline

Сообщений: 312



« Ответ #3 : 26 декабря 2010, 04:39:36 »

Возможно нужно менять в Header поле "Connection: keep-alive" на что-то другое?
Добавлено: 2010-12-26, 03:43:27

LuaTest.exe : "Access violation at address 00000000. Read of address 00000000."
Отвечу сам себе Улыбка
В программе не проверяется загрузка "lua5.1.dll" отсюда и такая ошибка.
Добавлено: 2010-12-26, 04:14:14

Итого, не получается никак изменить тело ответа, делаю так:
Код:
hc.answer_body = 'Доступ запрещён'
и заголовок ответа тоже не получается никак изменить:
Код:
hc.answer_header = re.replace(hc.answer_header, [[^Connection: \K(?!close)[^\r\n]+]], 'close')
hc.answer_header = re.replace(hc.answer_header, [[^Connection: \K[^\r\n]+]], 'Connection: close')

Думаю что ошибка в синтаксисе, но найти не получается.
Сообщить модератору   Записан
mai62
Автор HC
*****

Репутация: +226/-4
Offline Offline

Сообщений: 6383


« Ответ #4 : 26 декабря 2010, 12:28:16 »

Надо было показать свое расширение, чтобы можно было посмотреть, что там работает, а что нет.
Сообщить модератору   Записан
DIGGER
Старожил
****

Репутация: +14/-3
Offline Offline

Сообщений: 312



« Ответ #5 : 26 декабря 2010, 16:38:51 »

Да тут-то и показывать нечего:
Код:
function AnswerSend()

re.select_engine(1)
if re.match(hc.answer_header, [[\AHTTP/1\.\d 403]]) then
hc.answer_body = 'Доступ запрещён'
hc.extensions_on = false
hc.repeat_options('request', 0, 0)  -- отключение повторных запросов
hc.action = 'stop'
-- hc.monitor_string = 'TEST'
hc.client_disconnect() -- хоть как-то прервать загрузку, это срабатывает как надо
hc.answer_header = re.replace(hc.answer_header, [[\AHTTP/1\.1]], 'HTTP/1.0')
hc.answer_header = re.replace(hc.answer_header, [[^Connection: \K(?!close)[^\r\n]+]], 'close')
hc.answer_header = re.replace(hc.answer_header, [[^Connection: \K[^\r\n]+]], 'Connection: close')
hc.answer_header = re.replace(hc.answer_header, [[^Connection: .]], 'Connection: close')
-- hc.answer_header = 'Accept-Ranges: bytes Content-Length: 15 Connection: close Content-Type: text/html; charset=windows-1251'
end

end
Сообщить модератору   Записан
mai62
Автор HC
*****

Репутация: +226/-4
Offline Offline

Сообщений: 6383


« Ответ #6 : 26 декабря 2010, 17:39:37 »

Это все что ли? А где заголовок расширения? Без него обработчик вызываться не будет.
Добавлено: 26 Декабря 2010, 17:24:45

А эти строки зачем? Как правило, они не нужны. Ты их осознанно добавил?
Код:
re.select_engine(1)
Код:
hc.extensions_on = false
hc.repeat_options('request', 0, 0)  -- отключение повторных запросов
hc.action = 'stop'
Код:
hc.client_disconnect() -- хоть как-то прервать загрузку, это срабатывает как надо

Добавлено: 26 Декабря 2010, 17:28:42

Расширение должно выглядеть как-то так
Код:
--[[ <HCExtension>
@name          My 403
@event         BeforeRequestHeaderSend/MyAnswer
</HCExtension> ]]

function GetAnswerCode(s)
  _,_,x = string.find(s, "HTTP/1%.%d +(%d+)")
  if x==nil then return -1 else return tonumber(x) end
end

function MyAnswer()
  if GetAnswerCode(hc.answer_header) == 403 then
    hc.answer_header= ...
    hc.answer_body= ...
  end
end
Сообщить модератору   Записан
DIGGER
Старожил
****

Репутация: +14/-3
Offline Offline

Сообщений: 312



« Ответ #7 : 26 декабря 2010, 18:35:27 »

Цитировать
Это все что ли? А где заголовок расширения? Без него обработчик вызываться не будет.
я наверное не точно выразился, у меня расширение работает, заголовок опустил как само собой разумеющийся, срабатывает обработка на 403 + "re.match(hc.answer_header, [[\AHTTP/1\.\d 403]])" вроде быстрее Вашего варианта с выносом в отдельную функцию.

Без строки: "re.select_engine(1)" не работало! Возможно где-то что-то закэшировалось. т.к. я каждый раз не перезапускал HC.

Единственная не решённая трудность возникла с:
Код:
    hc.answer_header= ...
    hc.answer_body= ...

не присваивается и всё  Help me!   Потому и писал, что наверное у меня где-то синтаксих хромает.

Цитировать
А эти строки зачем?
Все строки добавлялись осознанно, кроме содержащих RegExp'ы, в них немного плаваю, но вроде правильно синтаксически построил.
"hc.extensions_on = false" — что бы обработка не шла дальше в CM и др. расширения.
"hc.repeat_options('request', 0, 0)" — иначе по 3 запроса + на FavIcon ещё три шло.
" hc.action = 'stop' " — в мануале написано что HC должен прекратить дальнейшую обработку, но на деле не увидел.
" hc.client_disconnect() " — поскольку др. способы не работали, то хоть как-то прерывал запросы в инет. Я понимаю что эту строку нужно отключить, когда получится заменять ответ от сервера на свой.

Сейчас у меня только один вопрос: Как заменить страничку ответа на свою? Строка "hc.answer_body = 'Доступ запрещён'" ни к чему не приводит  Плачущий
« Последнее редактирование: 26 декабря 2010, 18:43:24 от DIGGER » Сообщить модератору   Записан
mai62
Автор HC
*****

Репутация: +226/-4
Offline Offline

Сообщений: 6383


« Ответ #8 : 26 декабря 2010, 22:40:11 »

Цитировать
Сейчас у меня только один вопрос: Как заменить страничку ответа на свою?
Вот так:
Код:
--[[ <HCExtension>
@name          My 403
@event         BeforeAnswerHeaderSend/MyAnswer
</HCExtension> ]]

function GetAnswerCode(s)
  _,_,x = string.find(s, "HTTP/1%.%d +(%d+)")
  if x==nil then return -1 else return tonumber(x) end
end

function MyAnswer()
  if GetAnswerCode(hc.answer_header) == 403 then
    hc.answer_header= 'HTTP/1.1 403 Access denied\r\nConnection: close\r\nContent-Type: text\r\n\r\n'
    hc.answer_body= 'Доступ запрещён'
  end
end
Проверено, работает.
Сообщить модератору   Записан
DIGGER
Старожил
****

Репутация: +14/-3
Offline Offline

Сообщений: 312



« Ответ #9 : 26 декабря 2010, 23:00:01 »

Ваш пример работает, а мой не хотел работать. Строчкой преткновения оказалась "hc.extensions_on = false", если её удалить, то мой пример работает. Спасибо за помощь!

Поясню что происходит при обработке "hc.extensions_on = false": Браузер показывает что идёт ожидание ответа от прокси, HC показывает ответ, но он висит в обработке. Если в браузере нажать Esc (прервать загрузку), то в логе HC пишется что клиент дисконектед.

Вопрос: как остановить дальнейшую обработку по цепочке др. расширениями?
Сообщить модератору   Записан
mai62
Автор HC
*****

Репутация: +226/-4
Offline Offline

Сообщений: 6383


« Ответ #10 : 26 декабря 2010, 23:25:12 »

Цитировать
Вопрос: как остановить дальнейшую обработку по цепочке др. расширениями?
Добавить строку "hc.extensions_on = false". В свое расширение я добавил эту строку, расширение как работало так и работает.
Сообщить модератору   Записан
DIGGER
Старожил
****

Репутация: +14/-3
Offline Offline

Сообщений: 312



« Ответ #11 : 27 декабря 2010, 01:54:30 »

Намёк понял. спасибо. завтра попробую.
Сообщить модератору   Записан
DIGGER
Старожил
****

Репутация: +14/-3
Offline Offline

Сообщений: 312



« Ответ #12 : 27 декабря 2010, 10:30:06 »

при добавлении строки в Ваше расширение "hc.extensions_on = false", оно точно так же подвисает как и моё. (Как я описывал выше) Возможно дело в бета версии HC, но это смогу проверить только вечером.
Сообщить модератору   Записан
mai62
Автор HC
*****

Репутация: +226/-4
Offline Offline

Сообщений: 6383


« Ответ #13 : 27 декабря 2010, 13:09:11 »

Со строкой "hc.extensions_on = false" действительно есть проблемы. Исправлю в следующей версии. Тебе + за найденную ошибку.
Сообщить модератору   Записан
DIGGER
Старожил
****

Репутация: +14/-3
Offline Offline

Сообщений: 312



« Ответ #14 : 27 декабря 2010, 15:09:58 »

Спасибо!
Мне везёт на трудности  Веселый
(Серьёзно, по жизни, если что может пойти не так — всегда идёт не так. Но я уже привык — просто нужно стараться всё предусмотреть Подмигивающий )
Сообщить модератору   Записан
mai62
Автор HC
*****

Репутация: +226/-4
Offline Offline

Сообщений: 6383


« Ответ #15 : 27 декабря 2010, 15:53:13 »

До тебя hc.extensions_on никто не пытался использовать.

(А мне иногда кажется, что как только я подумаю о чем-то плохом, так это со мной происходит. Когда мне приходит в голову что-то плохое, плюю три раза через левое плечо. Мне помогает (только бы не сглазить).  Подмигивающий )
Сообщить модератору   Записан
Страниц: [1]   Вверх
  Отправить эту тему    Печать  

 
Перейти в: