klink0v (klink0v) wrote,
klink0v
klink0v

Category:

HTTP -> XMPP

Просто оставлю это здесь. Если потом вдруг когда-нибудь понадобится, чтобы потом не искать.

Одному коллеге понадобилось организовать передачу содержимого HTTP-GET запросов в виде XMPP-сообщений некоторым заранее определённым клиентам. Попросил меня реализовать.

"Забрать" GET-запрос несложно любым веб-сервером. Для того, чтобы потом отправить XMPP-сообщение, проще воспользоваться чем-то готовым. Из того, что я "сходу" накопал для решения, присутствуют три более-менее "живых" и "рабочих" библиотеки: libloudmouth, JAXL, XMPPHP.

Первая написана на C, вместе с ней идёт несложный пример использования, который представляет собой суть готовую программу. Её можно скомпилировать в бинарник и запускать прямо из CGI или из shell-скрипта. Бывает полезно, если принципиально не хочется водружать на машину PHP, либо речь идёт о каких-нибудь встраиваемых системах.

Вторая представляет собой супернавороченный комбайн, написанный на PHP. По-моему, он умеет всё, что только может и не может пригодиться. Этот вариант, скорее, для построения каких-нибудь интерактивных интеллектуальных систем и/или взаимодействия с клиентами через Ajax-скрипты на веб-сайтах. В принципе, он вполне подойдёт, но в данной задаче это всё равно что стрелять из пушки по воробьям.

Третья — более-менее маленькая (по количеству строк кода) поделка. Она умеет подключиться к Jabber-серверу (в том числе и с использованием TLS), что-нибудь кому-нибудь послать и отключиться. Собственно, ничего большего от неё и не требуется. Никаких зависимостей за собой не тянет. Распаковал архив на сервере, подключил к своему условному "index.php", вызываешь её методы (есть в прилагаемом примере), радуешься.

По ходу пьесы я наступил ещё на одни грабли. Тот самый коллега не отличается прямотой ручек, поэтому выпустил для своего сервера X509-сертификат на имя "localhost", одновременно жёстко заBINDив службу только на белый IP-адрес. Таким образом, даже добавить сертификат в "доверенные" на уровне системы не помогает: на localhost я подключиться не могу, потому что там не слушает сервер, а если подключаюсь на белый IP, то не совпадает имя в запросе на подключение и имя в сертификате. Пришлось разбираться, как в PHP можно отключить проверку хоста для TLS-соединений.

Для этого перед вызовом функции "stream_socket_client" необходимо создать так называемый "контекст" при помощи функции "stream_context_create()", который затем передать в качестве последнего необязательного параметра в "stream_socket_client()". Выглядит как-то примерно так.

Да, мартышничество, согласен. По-хорошему, лучше было бы перенастроить Jabber-сервер. Но конкретно в рассматриваемой ситуации это сделать было намного сложнее, чем вставить костыль в код. Проверено, работает.

Tags: hints, php, scripting, ссылки
Subscribe
  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 0 comments