|
|
Строка 1: |
Строка 1: |
− | == Готовая форма для вашего сайта ==
| + | Статья уже обновлена |
− | | + | |
− | <!--На продакшне лежит папка cross_domain. В ней лежат:
| + | |
− | - easyXDM.js (не трогаем, не меяем)
| + | |
− | - json2.js (не трогаем, не меяем)
| + | |
− | - папка cors
| + | |
− | -- easyXDM.swf (не трогаем, не меяем)
| + | |
− | -- index.html
| + | |
− | -- name.html (не трогаем, не меяем)
| + | |
− | Файл index.html нужен для добавления доменных имен, на которых предполагается расположить форму поиска. Доменные имена прописываются в 57 строке через запятую (4 инстанса):
| + | |
− | var alwaysTrustedOrigins = [(/www\.aviatrans\.ru/), (/aviatrans\.ru/), (/www\.avia\.aviatrans\.ru/), (/avia\.aviatrans\.ru/), (/xdm1/), (/.*/)];
| + | |
− | -->
| + | |
− | | + | |
− | Для размещения формы на своем сайте вам надо сделать следующее:
| + | |
− | | + | |
− | <ol>
| + | |
− | <li>Скачайте архив [http://xtrip-wiki.gridnine.com/wiki/images/7/72/Custom_form.zip Custom_form.zip], разархивируйте и разместите разархивированные файлы на хостинге вашего домена:<br>
| + | |
− | - json2.js<br>
| + | |
− | - easyXDM.js<br>
| + | |
− | - common.js<br>
| + | |
− | В файле '''common.js''' необходимо заменить '''dev.ibe.gridnine.com''' на доменное имя вашего сайта с Sabre IBE. Также необходимо указать путь к загруженным файлам.
| + | |
− | | + | |
− | <li>Прописать в '''<head>''' страницы, на которой будет расположена форма поиска (заменить '''dev.ibe.gridnine.com''' на доменное имя сайта с Sabre IBE):<br><br>
| + | |
− | | + | |
− | <pre><link rel="stylesheet" href="http://dev.ibe.gridnine.com/system/modules/com.gridnine.opencms.modules.sabre-ibe/resources/css/jquery-ui-1.8.6.custom.css" type="text/css" />
| + | |
− | <script type="text/javascript" src="http://dev.ibe.gridnine.com/system/modules/com.gridnine.opencms.modules.sabre-ibe/resources/js/jquery-1.5.js"></script>
| + | |
− | <script type="text/javascript" src="http://dev.ibe.gridnine.com/system/modules/com.gridnine.opencms.modules.sabre-ibe/resources/js/jquery-ui-1.8.6.custom.js"></script>
| + | |
− | <script type="text/javascript" src="http://dev.ibe.gridnine.com/system/modules/com.gridnine.opencms.modules.sabre-ibe/resources/js/jquery.tmpl.js"></script>
| + | |
− | <script type="text/javascript" src="http://dev.ibe.gridnine.com/system/modules/com.gridnine.opencms.modules.sabre-ibe/resources/js/jquery.maskedinput.js"></script>
| + | |
− | <script type="text/javascript" src="http://dev.ibe.gridnine.com/system/modules/com.gridnine.opencms.modules.sabre-ibe/resources/js/jquery.tipTip.js"></script>
| + | |
− | <script type="text/javascript" src="common.js"></script>
| + | |
− | <script type="text/javascript" src="easyXDM.js"></script>
| + | |
− | <script type="text/javascript" src="json2.js"></script>
| + | |
− | <script type="text/javascript" src="http://dev.ibe.gridnine.com/system/modules/com.gridnine.opencms.modules.sabre-ibe/resources/js/avia_step1.js?v=1401176648000&locale=ru"></script></pre>
| + | |
− | | + | |
− | Первая строка с указанием CSS отображает форму поиска в стандартном визуальном решении. Вы можете убрать эту строку или указать ссылку на собственный CSS-файл.<br><br>
| + | |
− | <div style="border-style: none; margin-top: -10px;" class="toccolours mw-collapsible mw-collapsed"><pre><link rel="stylesheet" href="http://dev.ibe.gridnine.com/system/modules/com.gridnine.opencms.modules.sabre-ibe/resources/css/jquery-ui-1.8.6.custom.css" type="text/css" /></pre></div>
| + | |
− | </li>
| + | |
− | | + | |
− | <li>Взять содержимое файла '''верстка v2.txt''' и разместить его в предполагаемом месте размещения формы поиска.</li>
| + | |
− | <li>При необходимости доработать CSS для формы поиска.</li>
| + | |
− | | + | |
− | </ol>
| + | |
− | <br>
| + | |
− | | + | |
− | == Более подробное описание запросов поиска перелетов ==
| + | |
− | <div style="border-style: none; float:left;" class="toccolours mw-collapsible mw-collapsed">
| + | |
− | | + | |
− | === Прямой перелет ===
| + | |
− | | + | |
− | Вы можете самостоятельно создать форму поиска любого удобного для вас дизайна для передачи данных в Sabre IBE. После передачи данных в нашу систему клиент попадет на второй шаг с результатами поиска.
| + | |
− | | + | |
− | '''Пример ссылки с передаваемыми данными''':
| + | |
− | | + | |
− | <font color="#0000ff">Имя_вашего_сайта/ru/step2.html?FlightSearchForm.From=<font color="#ff0000">REMOTE</font>&FlightSearchForm.routeType=<font color="#ff0000">ROUND_TRIP</font>&FlightSearchForm.departureLocation.0.CODE=<font color="#ff0000">MOW</font>&FlightSearchForm.arrivalLocation.0.CODE=<font color="#ff0000">LON</font>&FlightSearchForm.date.0=<font color="#ff0000">16.10.2011</font>&FlightSearchForm.date.1=<font color="#ff0000">25.10.2011</font>&FlightSearchForm.departureLocation.0.CODE=<font color="#ff0000">MOW</font>&FlightSearchForm.serviceClass=<font color="#ff0000">ECONOMY</font>&FlightSearchForm.adults=<font color="#ff0000">1</font>&FlightSearchForm.children=<font color="#ff0000">0</font>&FlightSearchForm.infants=<font color="#ff0000">0</font>&FlightSearchForm.infants_with_seat=<font color="#ff0000">1</font>&FlightSearchForm.searchType=<font color="#ff0000">FLIGHTS</font></font>
| + | |
− | | + | |
− | *Имя_вашего_сайта подменяется соответствующим доменным именем сайтом агентства.
| + | |
− | | + | |
− | === Описание параметров для передачи данных ===
| + | |
− | | + | |
− | '''FlightSearchForm.From:'''
| + | |
− | | + | |
− | *REMOTE
| + | |
− | | + | |
− | '''FlightSearchForm.routeType: (тип перелёта)'''
| + | |
− | | + | |
− | *ONE_WAY (В один конец)
| + | |
− | *ROUND_TRIP (Туда-Обратно)
| + | |
− | *MULTISTOP (Сложный маршрут)
| + | |
− | | + | |
− | '''FlightSearchForm.departureLocation.0.CODE:'''
| + | |
− | | + | |
− | *IATA код города вылета
| + | |
− | | + | |
− | '''FlightSearchForm.arrivalLocation.0.CODE:'''
| + | |
− | | + | |
− | *IATA код города прилёта
| + | |
− | | + | |
− | '''airport DME'''
| + | |
− | | + | |
− | *IATA код аэропорта вылета/прилёта. Можно указывать вместо города вылета/прилета.
| + | |
− | | + | |
− | '''FlightSearchForm.date.0: (дата вылета)'''
| + | |
− | | + | |
− | *дата в формате dd.MM.yyyy (напимер, 23.11.2011)
| + | |
− | | + | |
− | '''FlightSearchForm.date.1: (дата вылета обратно, только для ROUND_TRIP)'''
| + | |
− | | + | |
− | *дата в формате dd.MM.yyyy (напимер, 03.12.2011)
| + | |
− | | + | |
− | '''FlightSearchForm.adults: (количество взрослых)'''
| + | |
− | | + | |
− | *Число 1..6
| + | |
− | | + | |
− | '''FlightSearchForm.children: (количество детей)'''
| + | |
− | | + | |
− | *Число 0..6
| + | |
− | | + | |
− | '''FlightSearchForm.infants: (количество младенцев)'''
| + | |
− | | + | |
− | *Число 0..6
| + | |
− | | + | |
− | '''FlightSearchForm.infants_with_seat: (количество младенцев с местом)'''
| + | |
− | | + | |
− | *Число 0..6
| + | |
− | | + | |
− | '''FlightSearchForm.YOUTHS: (количество молодёжи)'''
| + | |
− | | + | |
− | *Число 0..6
| + | |
− | | + | |
− | '''FlightSearchForm.SENIORS: (количество пожилых)'''
| + | |
− | | + | |
− | *Число 0..6
| + | |
− | | + | |
− | '''FlightSearchForm.searchType: (поиск по конкретным датам/лучшей цене)'''
| + | |
− | | + | |
− | *FLIGHTS (конкретные даты)
| + | |
− | *NEAREST_DATES (по лучшей цене)
| + | |
− | | + | |
− | '''FlightSearchForm.serviceClass: (класс перелета)'''
| + | |
− | | + | |
− | *ECONOMY (Эконом)
| + | |
− | *BUSINESS (Бизнес)
| + | |
− | | + | |
− | '''FlightSearchForm.timeOfDay.0: (время вылета, необязательное поле)'''
| + | |
− | | + | |
− | *MORNING (Утро (06:00 - 12:00))
| + | |
− | *AFTERNOON (День (12:00 - 18:00))
| + | |
− | *EVENING (Вечер (18:00 - 00:00))
| + | |
− | *NIGHT (Ночь (00:00 - 06:00))
| + | |
− | | + | |
− | '''FlightSearchForm.timeOfDay.1: (время вылета обратно, только для ROUND_TRIP, необязательное поле)'''
| + | |
− | | + | |
− | *MORNING (Утро (06:00 - 12:00))
| + | |
− | *AFTERNOON (День (12:00 - 18:00))
| + | |
− | *EVENING (Вечер (18:00 - 00:00))
| + | |
− | *NIGHT (Ночь (00:00 - 06:00))
| + | |
− | | + | |
− | '''FlightSearchForm.airline: (может быть несколько, необязательное поле)'''
| + | |
− | | + | |
− | *IATA код авиакомпании. Если значений несколько, то они перечисляется несколькими парами, например: '''…&FlightSearchForm.airline=<font color="#ff0000">XX</font>&FlightSearchForm.airline=<font color="#ff0000">YY</font>&FlightSearchForm.airline=<font color="#ff0000">ZZ</font>&…'''
| + | |
− | | + | |
− | '''FlightSearchForm.skipConnected: (тип перелета – отображать только прямые/все перелеты, необязательное поле)'''
| + | |
− | | + | |
− | *TRUE – отображение только прямых перелетов
| + | |
− | *FALSE – отображение всех перелетов
| + | |
− | | + | |
− | <br>
| + | |
− | | + | |
− | === Сложный перелет ===
| + | |
− | | + | |
− | Рассмотрим ссылку на сложный перелет на примере перелета<span lang="ru-RU"> </span><font color="#0070c0"><span lang="ru-RU">Москва-Лондон</span></font><span lang="ru-RU">
| + | |
− | </span><font color="#00b050"><span lang="ru-RU">Лондон-Париж
| + | |
− | </span></font><span lang="ru-RU">– </span><font color="#7030a0"><span lang="ru-RU">Париж-Санкт-Петербург</span></font>
| + | |
− | | + | |
− | <font color="#ff0000"><span lang="ru-RU">'''Красным '''</span></font><span lang="ru-RU">выделены
| + | |
− | необходимые для внесения параметры. Порядок расположения данных
| + | |
− | запроса в ссылке непринципиален.</span>
| + | |
− | | + | |
− | <font color="#808080">http</font><font color="#808080"><span lang="ru-RU">://</span></font><font color="#808080">russia</font><font color="#808080"><span lang="ru-RU">.</span></font><font color="#808080">ibe</font><font color="#808080"><span lang="ru-RU">.</span></font><font color="#808080">gridnine</font><font color="#808080"><span lang="ru-RU">.</span></font><font color="#808080">com</font><font color="#808080"><span lang="ru-RU">/</span></font><font color="#808080">ru</font><font color="#808080"><span lang="ru-RU">/</span></font><font color="#808080">step</font><font color="#808080"><span lang="ru-RU">2.</span></font><font color="#808080">html</font><font color="#808080"><span lang="ru-RU">?</span></font><font color="#808080">FlightSearchForm</font><font color="#808080"><span lang="ru-RU">.</span></font><font color="#808080">From</font><font color="#808080"><span lang="ru-RU">=</span></font><font color="#808080">REMOTE</font>
| + | |
− | | + | |
− | &FlightSearchForm.routeType=<font color="#ff0000">'''MULTISTOP'''</font>
| + | |
− | | + | |
− | <font color="#0070c0">&FlightSearchForm.departureLocation.</font><font color="#ff0000">'''0'''</font><font color="#0070c0">.CODE=MOW</font>
| + | |
− | | + | |
− | <font color="#0070c0">&FlightSearchForm.arrivalLocation.</font><font color="#ff0000">'''0'''</font><font color="#0070c0">.CODE=LON</font>
| + | |
− | | + | |
− | <font color="#0070c0">&FlightSearchForm.date.</font><font color="#ff0000">'''0'''</font><font color="#0070c0">=16.10.2012</font>
| + | |
− | | + | |
− | <font color="#00b050">&FlightSearchForm.departureLocation.</font><font color="#ff0000">'''1'''</font><font color="#00b050">.CODE=LON</font>
| + | |
− | | + | |
− | <font color="#00b050">&FlightSearchForm.arrivalLocation.</font><font color="#ff0000">'''1'''</font><font color="#00b050">.CODE=PAR</font>
| + | |
− | | + | |
− | <font color="#00b050">&FlightSearchForm.date.</font><font color="#ff0000">'''1'''</font><font color="#00b050">=25.10.2012</font>
| + | |
− | | + | |
− | <font color="#7030a0">&FlightSearchForm.departureLocation.</font><font color="#ff0000">'''2'''</font><font color="#7030a0">.CODE=PAR</font>
| + | |
− | | + | |
− | <font color="#7030a0">&FlightSearchForm.arrivalLocation.</font><font color="#ff0000">'''2'''</font><font color="#7030a0">.CODE=LED</font>
| + | |
− | | + | |
− | <font color="#7030a0">&FlightSearchForm.date.</font><font color="#ff0000">'''2'''</font><font color="#7030a0">=28.10.2012</font>
| + | |
− | | + | |
− | <font color="#808080">&FlightSearchForm.serviceClass=ECONOMY</font>
| + | |
− | | + | |
− | <font color="#808080">&FlightSearchForm.adults=1</font>
| + | |
− | | + | |
− | <font color="#808080">&FlightSearchForm.children=0</font>
| + | |
− | | + | |
− | <font color="#808080">&FlightSearchForm.infants=0</font>
| + | |
− | | + | |
− | <font color="#808080">&FlightSearchForm.searchType=FLIGHTS</font>
| + | |
− | | + | |
− | <span lang="ru-RU">
| + | |
− | </span><span lang="ru-RU">…где
| + | |
− | выделенные красным «0», «1» и «2»
| + | |
− | – привязывают параметры к определенному перелету.</span>
| + | |
− | | + | |
− | Сама ссылка полностью выглядит так:
| + | |
− | | + | |
− | <font color="#0000ff">Имя_вашего_сайта/ru/step2.html?FlightSearchForm.From=REMOTE&FlightSearchForm.routeType=<font color="#ff0000">'''MULTISTOP'''</font>&FlightSearchForm.departureLocation.<font color="#ff0000">'''0'''</font>.CODE=MOW&FlightSearchForm.arrivalLocation.<font color="#ff0000">'''0'''</font>.CODE=LON&FlightSearchForm.date.<font color="#ff0000">'''0'''</font>=16.10.2012&FlightSearchForm.departureLocation.<font color="#ff0000">'''1'''</font>.CODE=LON&FlightSearchForm.arrivalLocation.<font color="#ff0000">'''1'''</font>.CODE=PAR&FlightSearchForm.date.<font color="#ff0000">'''1'''</font>=25.10.2012&FlightSearchForm.departureLocation.<font color="#ff0000">'''2'''</font>.CODE=PAR&FlightSearchForm.arrivalLocation.<font color="#ff0000">'''2'''</font>.CODE=LED&FlightSearchForm.date.<font color="#ff0000">'''2'''</font>=28.10.2012&FlightSearchForm.serviceClass=ECONOMY&FlightSearchForm.adults=1&FlightSearchForm.children=0&FlightSearchForm.infants=0&FlightSearchForm.searchType=FLIGHTS</font>
| + | |
− | | + | |
− | === Запрос названия города для подстановки в поля «Пункт отправления» «Пункт назначения» ===
| + | |
− | | + | |
− | <spoiler text="In English">Requests for cities and carriers autocompletion:
| + | |
− | | + | |
− | To get the list of applicable cities or carriers by name (or a part of name) or IATA code you need to send a GET or POST request to
| + | |
− | | + | |
− | Name_of_your_website/system/modules/com.gridnine.opencms.modules.sabre-ibe/pages/ajax_provider_locations.jsp
| + | |
− | | + | |
− | * Name_of_your_website should be replaced by your IBE domain name;
| + | |
− | | + | |
− | Request parameters:
| + | |
− | | + | |
− | cmd=GET_LOCATIONS (used to get list of locations)
| + | |
− | | + | |
− | cmd=GET_AIRLINES (used to get list of carriers)
| + | |
− | | + | |
− | locale=en
| + | |
− | | + | |
− | term=...
| + | |
− | | + | |
− | Name (or a part of name) or IATA code of airport/city/carrier should be passed as the value of the 'term' parameter (e.g.: term=Mos, term=MOW, for a carrier: term=SU).
| + | |
− | | + | |
− | The page will return the response in JSON format as the result.
| + | |
− | | + | |
− | The whole request should look something like that:
| + | |
− | | + | |
− | Name_of_your_website/system/modules/com.gridnine.opencms.modules.sabre-ibe/pages/ajax_provider_locations.jsp?cmd=GET_LOCATIONS&locale=ru&term=moscow</spoiler>
| + | |
− | | + | |
− | Для получения данных о пунктах назначения нужно отправить запрос GET или POST на адрес:
| + | |
− | | + | |
− | <font color="#0000ff">Имя_вашего_сайта/system/modules/com.gridnine.opencms.modules.sabre-ibe/pages/ajax_provider_locations.jsp</font>
| + | |
− | | + | |
− | <nowiki>*</nowiki> Имя_вашего_сайта - надо подставить соответствующее доменное имя сайта агентства
| + | |
− | | + | |
− | <span lang="ru-RU">'''Параметры'''</span>''':'''
| + | |
− | | + | |
− | cmd=<font color="#0000ff"><span lang="ru-RU">'''GET_LOCATIONS'''</span></font>
| + | |
− | | + | |
− | cmd=<font color="#0000ff"><span lang="ru-RU">'''GET_AIRLINES'''</span></font>
| + | |
− | | + | |
− | <font color="#0000ff">'''locale=ru'''</font>
| + | |
− | | + | |
− | <font color="#0000ff"><span lang="ru-RU">'''term=...'''</span></font>
| + | |
− | | + | |
− | В качестве значения term нужно передать название или IATA-код, или часть названия геолокации/авиакомпании которые нужно найти (например для городов: term=Mos, term=MOW, для а/к: term=SU).
| + | |
− | | + | |
− | В результате запроса, страница вернет ответ в формате JSON.
| + | |
− | | + | |
− | Целиком запрос должен выглядеть например так:
| + | |
− | | + | |
− | <font color="#0000ff"><span lang="ru-RU">Имя_вашего_сайта/system/modules/com.gridnine.opencms.modules.sabre-ibe/pages/ajax_provider_locations.jsp?cmd=</span></font><font color="#0000ff"><span lang="ru-RU">'''GET_LOCATIONS'''</span></font><font color="#0000ff"><span lang="ru-RU">&</span></font><font color="#0000ff"><span lang="ru-RU">'''locale=ru'''</span></font><font color="#0000ff"><span lang="ru-RU">&</span></font><font color="#0000ff"><span lang="ru-RU">'''term=moscow'''</span></font>
| + | |
− | | + | |
− | === Принцип размещения и работы скрипта для кроссдоменных запросов ===
| + | |
− | Для отправки междоменных запросов можно использовать PHP-прокси.
| + | |
− | Скрипт устаналивается на свой сервер, после чего на этот скрипт транслируются ajax-запросы.
| + | |
− | | + | |
− | Пример получения списка городов autocomplete (пример кода для Autocomplete в сборке Jquery-ui v1.8.6):
| + | |
− | | + | |
− | КОД HTML:
| + | |
− | <pre><input type="text" name="FlightSearchForm.departureLocation.0" />
| + | |
− | <input type="hidden" name="FlightSearchForm.departureLocation.0.CODE" value="" /></pre>
| + | |
− | | + | |
− | КОД JAVASCRIPT:
| + | |
− | <pre>$(document).ready(function() {
| + | |
− | $('input').autocomplete({
| + | |
− | source: "/ПУТЬ_ДО_СКРИПТА/proxy.php?csurl=http://ИМЯ_ВАШЕГО_САЙТА/system/modules/com.gridnine.opencms.modules.sabre-ibe/pages/ajax_provider_locations.jsp&cmd=GET_LOCATIONS&locale=ru",
| + | |
− | minLength: 0,
| + | |
− | focus: function(event, ui) {
| + | |
− | return false;
| + | |
− | },
| + | |
− | select: function(event, ui) {
| + | |
− | $(this).val(ui.item.label).next().val(ui.item.value);
| + | |
− | $(this).trigger('change');
| + | |
− | return false;
| + | |
− | }
| + | |
− | }).click(function(){
| + | |
− | $(this)
| + | |
− | .val("")
| + | |
− | .next()
| + | |
− | .val("")
| + | |
− | .end()
| + | |
− | .autocomplete("search");
| + | |
− | });
| + | |
− | });
| + | |
− | </pre>
| + | |
− | | + | |
− | Вариант скрипта proxy.php:
| + | |
− | | + | |
− | <pre>
| + | |
− | <?php
| + | |
− | | + | |
− | /**
| + | |
− | * AJAX Cross Domain (PHP) Proxy 0.7
| + | |
− | * by Iacovos Constantinou (http://www.iacons.net)
| + | |
− | *
| + | |
− | * Released under CC-GNU GPL
| + | |
− | */
| + | |
− | | + | |
− | /**
| + | |
− | * Enables or disables filtering for cross domain requests.
| + | |
− | * Recommended value: true
| + | |
− | */
| + | |
− | define( 'CSAJAX_FILTERS', true );
| + | |
− | | + | |
− | /**
| + | |
− | * If set to true, $valid_requests should hold only domains i.e. a.example.com, b.example.com, usethisdomain.com
| + | |
− | * If set to false, $valid_requests should hold the whole URL ( without the parameters ) i.e. http://example.com/this/is/long/url/
| + | |
− | * Recommended value: false (for security reasons - do not forget that anyone can access your proxy)
| + | |
− | */
| + | |
− | define( 'CSAJAX_FILTER_DOMAIN', false );
| + | |
− | | + | |
− | /**
| + | |
− | * Set debugging to true to receive additional messages - really helpful on development
| + | |
− | */
| + | |
− | define( 'CSAJAX_DEBUG', true );
| + | |
− | | + | |
− | /**
| + | |
− | * A set of valid cross domain requests
| + | |
− | */
| + | |
− | $valid_requests = array(
| + | |
− | 'http://dev.ibe.gridnine.com/system/modules/com.gridnine.opencms.modules.sabre-ibe/pages/ajax_provider_locations.jsp'
| + | |
− | );
| + | |
− | | + | |
− | /* * * STOP EDITING HERE UNLESS YOU KNOW WHAT YOU ARE DOING * * */
| + | |
− | | + | |
− | // identify request headers
| + | |
− | $request_headers = array( );
| + | |
− | foreach ( $_SERVER as $key => $value ) {
| + | |
− | if ( substr( $key, 0, 5 ) == 'HTTP_' ) {
| + | |
− | $headername = str_replace( '_', ' ', substr( $key, 5 ) );
| + | |
− | $headername = str_replace( ' ', '-', ucwords( strtolower( $headername ) ) );
| + | |
− | if ( !in_array( $headername, array( 'Host', 'X-Proxy-Url' ) ) ) {
| + | |
− | $request_headers[] = "$headername: $value";
| + | |
− | }
| + | |
− | }
| + | |
− | }
| + | |
− | | + | |
− | // identify request method, url and params
| + | |
− | $request_method = $_SERVER['REQUEST_METHOD'];
| + | |
− | $request_params = ( $request_method == 'GET' ) ? $_GET : $_POST;
| + | |
− | // Get URL from `csurl` in GET or POST data, before falling back to X-Proxy-URL header.
| + | |
− | $request_url = urldecode( isset( $_REQUEST['csurl'] ) ? $_REQUEST['csurl'] : $_SERVER['HTTP_X_PROXY_URL'] );
| + | |
− | $p_request_url = parse_url( $request_url );
| + | |
− | unset( $request_params['csurl'] );
| + | |
− | | + | |
− | // ignore requests for proxy :)
| + | |
− | if ( preg_match( '!' . $_SERVER['SCRIPT_NAME'] . '!', $request_url ) || empty( $request_url ) || count( $p_request_url ) == 1 ) {
| + | |
− | csajax_debug_message( 'Invalid request - make sure that csurl variable is not empty' );
| + | |
− | exit;
| + | |
− | }
| + | |
− | | + | |
− | // check against valid requests
| + | |
− | if ( CSAJAX_FILTERS ) {
| + | |
− | $parsed = $p_request_url;
| + | |
− | if ( CSAJAX_FILTER_DOMAIN ) {
| + | |
− | if ( !in_array( $parsed['host'], $valid_requests ) ) {
| + | |
− | csajax_debug_message( 'Invalid domain - ' . $parsed['host'] . ' does not included in valid requests' );
| + | |
− | exit;
| + | |
− | }
| + | |
− | } else {
| + | |
− | $check_url = isset( $parsed['scheme'] ) ? $parsed['scheme'] . '://' : '';
| + | |
− | $check_url .= isset( $parsed['user'] ) ? $parsed['user'] . ($parsed['pass'] ? ':' . $parsed['pass'] : '') . '@' : '';
| + | |
− | $check_url .= isset( $parsed['host'] ) ? $parsed['host'] : '';
| + | |
− | $check_url .= isset( $parsed['port'] ) ? ':' . $parsed['port'] : '';
| + | |
− | $check_url .= isset( $parsed['path'] ) ? $parsed['path'] : '';
| + | |
− | if ( !in_array( $check_url, $valid_requests ) ) {
| + | |
− | csajax_debug_message( 'Invalid domain - ' . $request_url . ' does not included in valid requests' );
| + | |
− | exit;
| + | |
− | }
| + | |
− | }
| + | |
− | }
| + | |
− | | + | |
− | // append query string for GET requests
| + | |
− | if ( $request_method == 'GET' && count( $request_params ) > 0 && (!array_key_exists( 'query', $p_request_url ) || empty( $p_request_url['query'] ) ) ) {
| + | |
− | $request_url .= '?' . http_build_query( $request_params );
| + | |
− | }
| + | |
− | | + | |
− | // let the request begin
| + | |
− | $ch = curl_init( $request_url );
| + | |
− | curl_setopt( $ch, CURLOPT_HTTPHEADER, $request_headers ); // (re-)send headers
| + | |
− | curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true ); // return response
| + | |
− | curl_setopt( $ch, CURLOPT_HEADER, true ); // enabled response headers
| + | |
− | // add post data for POST requests
| + | |
− | if ( $request_method == 'POST' ) {
| + | |
− | curl_setopt( $ch, CURLOPT_POST, true );
| + | |
− | curl_setopt( $ch, CURLOPT_POSTFIELDS, http_build_query( $request_params ) );
| + | |
− | }
| + | |
− | | + | |
− | // retrieve response (headers and content)
| + | |
− | $response = curl_exec( $ch );
| + | |
− | curl_close( $ch );
| + | |
− | | + | |
− | // split response to header and content
| + | |
− | list($response_headers, $response_content) = preg_split( '/(\r\n){2}/', $response, 2 );
| + | |
− | | + | |
− | // (re-)send the headers
| + | |
− | $response_headers = preg_split( '/(\r\n){1}/', $response_headers );
| + | |
− | foreach ( $response_headers as $key => $response_header ) {
| + | |
− | // Rewrite the `Location` header, so clients will also use the proxy for redirects.
| + | |
− | if ( preg_match( '/^Location:/', $response_header ) ) {
| + | |
− | list($header, $value) = preg_split( '/: /', $response_header, 2 );
| + | |
− | $response_header = 'Location: ' . $_SERVER['REQUEST_URI'] . '?csurl=' . $value;
| + | |
− | }
| + | |
− | if ( !preg_match( '/^(Transfer-Encoding):/', $response_header ) ) {
| + | |
− | header( $response_header );
| + | |
− | }
| + | |
− | }
| + | |
− | | + | |
− | // finally, output the content
| + | |
− | print($response_content );
| + | |
− | | + | |
− | function csajax_debug_message( $message )
| + | |
− | {
| + | |
− | if ( true == CSAJAX_DEBUG ) {
| + | |
− | print $message . PHP_EOL;
| + | |
− | }
| + | |
− | }
| + | |
− | | + | |
− | ?>
| + | |
− | </pre>
| + | |
− | </div>
| + | |