Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Рефакторинг метода ВызватьHTTPМетод #86

Closed
slaxxals opened this issue Sep 18, 2021 · 2 comments
Closed

Рефакторинг метода ВызватьHTTPМетод #86

slaxxals opened this issue Sep 18, 2021 · 2 comments
Assignees

Comments

@slaxxals
Copy link
Contributor

Предлагаю немного переделать метод ВызватьHTTPМетод.

Сейчас:

Функция ВызватьHTTPМетод(Сессия, Метод, URL, ДополнительныеПараметры)

	КодыСостоянияHTTP = КодыСостоянияHTTP();

	ПодготовленныйЗапрос = ПодготовитьЗапрос(Сессия, Метод, URL, ДополнительныеПараметры);

	НастройкиПодключения = НастройкиПодключения(Метод, URL, ДополнительныеПараметры);

	Ответ = ОтправитьЗапрос(Сессия, ПодготовленныйЗапрос, НастройкиПодключения);

	Перенаправление = 0;
	Пока Перенаправление < Сессия.МаксимальноеКоличествоПеренаправлений Цикл
		Если Не НастройкиПодключения.РазрешитьПеренаправление ИЛИ Не Ответ.ЭтоРедирект Тогда
			Возврат Ответ;
		КонецЕсли;

		НовыйURL = СформироватьНовыйURLПриПеренаправлении(Ответ);

		ПодготовленныйЗапрос.URL = КодироватьСтроку(НовыйURL, СпособКодированияСтроки.URLВКодировкеURL);
		НовыйHTTPЗапрос = Новый HTTPЗапрос(СобратьАдресРесурса(РазобратьURL(НовыйURL), Неопределено));
		ПереопределитьМетод(ПодготовленныйЗапрос, Ответ);

		Если Ответ.КодСостояния <> КодыСостоянияHTTP.ВременноеПеренаправление_307
			И Ответ.КодСостояния <> КодыСостоянияHTTP.ПостоянноеПеренаправление_308 Тогда
			УдалитьЗаголовки(ПодготовленныйЗапрос.Заголовки, "content-length,content-type,transfer-encoding");
			НовыйHTTPЗапрос.Заголовки = ПодготовленныйЗапрос.Заголовки;
		Иначе
			ИсходныйПоток = ПодготовленныйЗапрос.HTTPЗапрос.ПолучитьТелоКакПоток();
			ИсходныйПоток.КопироватьВ(НовыйHTTPЗапрос.ПолучитьТелоКакПоток());
		КонецЕсли;
		ПодготовленныйЗапрос.HTTPЗапрос = НовыйHTTPЗапрос;
		УдалитьЗаголовки(ПодготовленныйЗапрос.Заголовки, "cookies");

		ПодготовленныйЗапрос.Cookies = ОбъединитьCookies(Сессия.Cookies, ПодготовленныйЗапрос.Cookies);
		ПодготовитьCookies(ПодготовленныйЗапрос);

		// INFO: по хорошему аутентификацию нужно привести к новых параметрам, но пока будем игнорировать.

		Ответ = ОтправитьЗапрос(Сессия, ПодготовленныйЗапрос, НастройкиПодключения);

		Перенаправление = Перенаправление + 1;
	КонецЦикла;

	ВызватьИсключение("СлишкомМногоПеренаправлений");

КонецФункции

Результат рефакторинга:

Функция ВызватьHTTPМетод(Сессия, Метод, URL, ДополнительныеПараметры)

	ПодготовленныйЗапрос = ПодготовитьЗапрос(Сессия, Метод, URL, ДополнительныеПараметры);

	НастройкиПодключения = НастройкиПодключения(Метод, URL, ДополнительныеПараметры);

	Ответ = ОтправитьЗапрос(Сессия, ПодготовленныйЗапрос, НастройкиПодключения);
	
	Если НастройкиПодключения.РазрешитьПеренаправление И Ответ.ЭтоРедирект Тогда
		Ответ = ПеренаправитьЗапрос(Сессия, НастройкиПодключения, ПодготовленныйЗапрос, Ответ);
	КонецЕсли;
	
	Возврат Ответ;

КонецФункции

Функция ПеренаправитьЗапрос(Сессия, НастройкиПодключения, ПодготовленныйЗапрос, ПеренаправленныйОтвет)
	
	Перенаправление = 0;
	
	Пока ПеренаправленныйОтвет.ЭтоРедирект Цикл
		
		ПодготовитьЗапросДляРедиректа(Сессия, ПодготовленныйЗапрос, ПеренаправленныйОтвет);
		
		ПеренаправленныйОтвет = ОтправитьЗапрос(Сессия, ПодготовленныйЗапрос, НастройкиПодключения);
		
		Перенаправление = Перенаправление + 1;
		
		Если Перенаправление > Сессия.МаксимальноеКоличествоПеренаправлений Тогда
			ВызватьИсключение("СлишкомМногоПеренаправлений");
		КонецЕсли;
		
	КонецЦикла;
	
	Возврат ПеренаправленныйОтвет;
	
КонецФункции

Процедура ПодготовитьЗапросДляРедиректа(Сессия, ПодготовленныйЗапрос, ПеренаправленныйОтвет)
	
	КодыСостоянияHTTP = КодыСостоянияHTTP();
	
	НовыйURL = СформироватьНовыйURLПриПеренаправлении(ПеренаправленныйОтвет);
	
	ПодготовленныйЗапрос.URL = КодироватьСтроку(НовыйURL, СпособКодированияСтроки.URLВКодировкеURL);
	НовыйHTTPЗапрос = Новый HTTPЗапрос(СобратьАдресРесурса(РазобратьURL(НовыйURL), Неопределено));
	ПереопределитьМетод(ПодготовленныйЗапрос, ПеренаправленныйОтвет);

	Если ПеренаправленныйОтвет.КодСостояния <> КодыСостоянияHTTP.ВременноеПеренаправление_307
		И ПеренаправленныйОтвет.КодСостояния <> КодыСостоянияHTTP.ПостоянноеПеренаправление_308 Тогда
		УдалитьЗаголовки(ПодготовленныйЗапрос.Заголовки, "content-length,content-type,transfer-encoding");
		НовыйHTTPЗапрос.Заголовки = ПодготовленныйЗапрос.Заголовки;
	Иначе
		ИсходныйПоток = ПодготовленныйЗапрос.HTTPЗапрос.ПолучитьТелоКакПоток();
		ИсходныйПоток.КопироватьВ(НовыйHTTPЗапрос.ПолучитьТелоКакПоток());
	КонецЕсли;
	
	ПодготовленныйЗапрос.HTTPЗапрос = НовыйHTTPЗапрос;
	УдалитьЗаголовки(ПодготовленныйЗапрос.Заголовки, "cookies");

	ПодготовленныйЗапрос.Cookies = ОбъединитьCookies(Сессия.Cookies, ПодготовленныйЗапрос.Cookies);
	ПодготовитьCookies(ПодготовленныйЗапрос);
	
КонецПроцедуры
@slaxxals slaxxals changed the title Refactor метода ВызватьHTTPМетод Рефакторинг метода ВызватьHTTPМетод Sep 18, 2021
@vbondarevsky
Copy link
Owner

Выглядит разумно, жду PR

@slaxxals
Copy link
Contributor Author

Изменения добавлены к PR #85

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants