ANTICHAT — форум по информационной безопасности, OSINT и технологиям
ANTICHAT — русскоязычное сообщество по безопасности, OSINT и программированию.
Форум ранее работал на доменах antichat.ru, antichat.com и antichat.club,
и теперь снова доступен на новом адресе —
forum.antichat.xyz.
Форум восстановлен и продолжает развитие: доступны архивные темы, добавляются новые обсуждения и материалы.
⚠️ Старые аккаунты восстановить невозможно — необходимо зарегистрироваться заново.
 |
|

27.05.2010, 23:24
|
|
Постоянный
Регистрация: 20.01.2010
Сообщений: 338
Провел на форуме: 500264
Репутация:
69
|
|
js и php я чутка и так знаю =) на уровне не новичка так скажем))
|
|
|
ну звиздец какойто просто... |

28.05.2010, 01:52
|
|
Постоянный
Регистрация: 20.01.2010
Сообщений: 338
Провел на форуме: 500264
Репутация:
69
|
|
ну звиздец какойто просто...
Дабы не плодить кучу тем по моим вопросам, задам вопрос тут. Есть 1 функция и одна процедура. Обе взаимосвязанны. Называются Get и Redirect. Думаю человек, знающий протокол HTTP поймет, что за функции. Допустим при выполнении функции GET произошло 2 редиректа. Как сделать так, что бы функция GET закончила свое выполнение, до тех пор, пока все редиректы не закончатся? т.е. вернула страницу конечного редиректа. В моем же случае функция GET возврщает код 1й страницы, а нужно той страницы, на которую произошла переадресация. Получается так, что функция get работает дальше и грузит все страницы, но в том коде, в котором она выполняется она отдала код 1й страницы и все. Привожу коды обеих процедур:
Код:
// ---- Обрабатываем перенаправление ----
procedure THTTPCli.Redirect(const AData, AHost: string);
var
Location : string;
begin
Location := AData;
Location := Copy(Location, Pos('Location:', Location) +10, Length(Location));
Delete(Location, Pos(#13, Location), Length(Location));
// Проверка локаций и исправление
If Location[1] = '/' Then Get(AHost + Location);
If (Location[1] <> '/') And (Pos('http://', location) = 0) Then
begin
Location := '/' + Location;
Get('http://' + AHost + Location);
end;
If Pos('http://', Location) <> 0 then
begin
Location := Copy(Location, Length(GetHost(Location)) +8, Length(Location));
Get(Location);
end;
end;
// ---- Отправка GET-запроса ---- ;overload
function THTTPCli.Get(const AURL: string): string;
var
Head : string;
Host : string;
urlObj : string;
begin
{ Парсим url }
urlObj := AURL;
urlObj := Copy(urlObj, Length(GetHost(urlObj)) +8, Length(urlObj));
Host := GetHost(AURL);
// Составляем заголовок без куков
Head := 'GET ' + urlObj + ' HTTP/1.1' + crlf +
'User-Agent: Mozilla/4.8 [en](Windows NT 5.0; U)' + crlf +
'Connection: close' + crlf +
'Host: ' + Host + crlf + crlf;
// А если таковые имеются, прибавляем их к заголовку
If Length(_cookie) <> 0 Then
begin
Head := 'GET ' + urlObj + ' HTTP/1.1' + crlf +
'User-Agent: Mozilla/4.8 [en](Windows NT 5.0; U)' + crlf +
'Connection: close' + crlf +
'Cookie: ' + _cookie + crlf +
'Host: ' + Host + crlf + crlf;
end;
// Отсылаем запрос
SendRequest(Host, 80, Head, Result);
// Если сервер сказал 302, переходим по сказанной локации
If Pos('302', Result) <> 0 then
begin
Redirect(Result, Host);
end;
end;
блин как запарился уже. Извините за офтоп и кучу всем давно надоевшим вопросам.
Последний раз редактировалось RedFern.89; 28.05.2010 в 02:32..
Причина: дикий звиздец
|
|
|

28.05.2010, 08:54
|
|
Участник форума
Регистрация: 20.12.2008
Сообщений: 277
Провел на форуме: 828081
Репутация:
84
|
|
If Pos('302', Result) <> 0 then
Хм, если на странице просто попадется "302" то это будет считаться как редирект?
Вообще, если я правильно тебя понял то тебе надо просто организовать цикл.
Что-то типа:
while Pos('302', Result) <> 0 do
Redirect(Result, Host);
|
|
|

28.05.2010, 12:56
|
|
Постоянный
Регистрация: 20.01.2010
Сообщений: 338
Провел на форуме: 500264
Репутация:
69
|
|
Сообщение от GhostOnline
Хм, если на странице просто попадется "302" то это будет считаться как редирект?
Вообще, если я правильно тебя понял то тебе надо просто организовать цикл.
Что-то типа:
while Pos('302', Result) <> 0 do
Redirect(Result, Host);
и в твоем случае он будет все время грузить последнюю страницу... не вариант
|
|
|

28.05.2010, 16:37
|
|
Участник форума
Регистрация: 20.12.2008
Сообщений: 277
Провел на форуме: 828081
Репутация:
84
|
|
Так епт сделай Redirect функцией, которая например возвращает true если редирект был и false если не был
Вообше, имхо извращенное у тебя распределение по методам
|
|
|

28.05.2010, 20:57
|
|
Постоянный
Регистрация: 20.01.2010
Сообщений: 338
Провел на форуме: 500264
Репутация:
69
|
|
GhostOnline, пример в студию!!!
|
|
|

28.05.2010, 21:10
|
|
Постоянный
Регистрация: 13.12.2008
Сообщений: 354
Провел на форуме: 1747641
Репутация:
175
|
|
Нужно чтобы твоя функция Redirect возвращала тело новой скачанной страницы. Тогда можно реализовать цикл, который написал GhostOnline.
|
|
|

29.05.2010, 02:30
|
|
Постоянный
Регистрация: 20.01.2010
Сообщений: 338
Провел на форуме: 500264
Репутация:
69
|
|
вообщето цикл так и висит, потому-что он читает код первого ответа и все...
|
|
|

29.05.2010, 16:39
|
|
Участник форума
Регистрация: 20.12.2008
Сообщений: 277
Провел на форуме: 828081
Репутация:
84
|
|
Пипец..Ты зациклил 2 метода, в первом вызываешь второй, во втором первый, и т.д.. еще удивляешься почему возвращается "код певрого ответа"
Get - функция, она возвращает result.
Далее если ответ 302 то ты вызываешь процедуру Redirect и ей передаешь resault.
Процедура по определению ничего не возвращает, и с result ничего не делает, потому что:
1. Ты в процедуре не оперируешь параметром AData
2. Даже если бы захотел оперировать, то значение все равно бы не изменилось, ибо: const AData
// Если сервер сказал 302, переходим по сказанной локации
If Pos('302', Result) <> 0 then
begin
Redirect(Result, Host);
end;
Переходить то ты переходишь, но с какого х** result должна измениться если ты в этой функции с ней ничего больше не делаешь?
PS Мораль такова: вызываемая подпрограмма не может изменять результат той подпрограммы в которой она была вызвана, за исключением способа передачи по ссылке(var)
Последний раз редактировалось GhostOnline; 29.05.2010 в 16:41..
|
|
|

31.05.2010, 00:23
|
|
Постоянный
Регистрация: 20.01.2010
Сообщений: 338
Провел на форуме: 500264
Репутация:
69
|
|
уважаемый GhostOnline, я вас понел)) спасибо большое))
|
|
|
|
 |
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|