<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>по стопам webkill&#039;а &#187; tempfile</title>
	<atom:link href="http://blog.lukmus.ru/tag/tempfile/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.lukmus.ru</link>
	<description>это наш химический дом для печальных жителей Земли</description>
	<lastBuildDate>Sat, 21 Oct 2023 19:10:13 +0000</lastBuildDate>
	<language>ru-RU</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.4.2</generator>
		<item>
		<title>XML-RPC+gzip+base64 на Ruby</title>
		<link>http://blog.lukmus.ru/2011/01/26/xml-rpcgzipbase64-na-ruby/</link>
		<comments>http://blog.lukmus.ru/2011/01/26/xml-rpcgzipbase64-na-ruby/#comments</comments>
		<pubDate>Wed, 26 Jan 2011 08:35:38 +0000</pubDate>
		<dc:creator>lukmus</dc:creator>
				<category><![CDATA[ruby & ruby on rails]]></category>
		<category><![CDATA[deflate]]></category>
		<category><![CDATA[gzip]]></category>
		<category><![CDATA[inflate]]></category>
		<category><![CDATA[rexml]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[tempfile]]></category>
		<category><![CDATA[xml]]></category>
		<category><![CDATA[xml-rpc]]></category>
		<category><![CDATA[xmlrpc]]></category>
		<category><![CDATA[zlib]]></category>

		<guid isPermaLink="false">http://blog.lukmus.ru/?p=889</guid>
		<description><![CDATA[Пишу здесь чтобы не забыть. Сейчас XML-RPC довольно популярен, и как показывает практика мало кто, например из интернет-магазинов, использует его в чистом виде. В основном ресурсы, где выходной XML довольно большой, любят сжимать его Zlib&#8217;ом и после чего этот бинарник шифровать base64, а-ля он вовсе и не бинарник. XML-RPC Для XML-RPC в Ruby замечательная библиотека [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.lukmus.ru/wp-content/uploads/2011/01/logo.png"><img class="size-full wp-image-890 alignright" style="margin-right: 4px;" title="logo" src="http://blog.lukmus.ru/wp-content/uploads/2011/01/logo.png" alt="" width="158" height="48" /></a>Пишу здесь чтобы не забыть. Сейчас XML-RPC довольно популярен, и как показывает практика мало кто, например из интернет-магазинов, использует его в чистом виде. В основном ресурсы, где выходной XML довольно большой, любят сжимать его Zlib&#8217;ом и после чего этот бинарник шифровать base64, а-ля он вовсе и не бинарник.<span id="more-889"></span></p>
<h2>XML-RPC</h2>
<p>Для XML-RPC в Ruby замечательная библиотека с одноименным названием XMLRPC.</p>
<p>И для примера рассмотрим как ей пользоватся:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #b1b100;">require</span> <span style="color: #0000ff;">'xmlrpc/client'</span>
XMLRPC<span style="color: #339933;">::</span><span style="color: #004000;">Client</span><span style="color: #339933;">.</span>class_eval <span style="color: #b1b100;">do</span>
    def parse_content_type<span style="color: #009900;">&#40;</span>a<span style="color: #009900;">&#41;</span>
      <span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'text/xml'</span><span style="color: #009900;">&#93;</span>
    <span style="color: #990000;">end</span>
  <span style="color: #990000;">end</span>
&nbsp;
client <span style="color: #339933;">=</span> XMLRPC<span style="color: #339933;">::</span><span style="color: #004000;">Client</span><span style="color: #339933;">.</span>new2<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;http://site.ru/xml&quot;</span><span style="color: #009900;">&#41;</span>
result <span style="color: #339933;">=</span> client<span style="color: #339933;">.</span>call<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;xmlrpc.cmd&quot;</span><span style="color: #009900;">&#41;</span></pre></td></tr></table></div>

<p>Перегрузка <code>parse_content_type</code> нужна для того, чтобы Ruby не смущался, когда заголовок у выходного документа не <code>text/xml</code>. Об этой штуке  я прочитал на <a href="http://blog.alno.name/ru/2009/03/xmlrpc-in-ruby" target="_blank">http://blog.alno.name/ru/2009/03/xmlrpc-in-ruby</a>.</p>
<p>Если для XML-RPC нужна базовая авторизация, то используем</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="php" style="font-family:monospace;">client <span style="color: #339933;">=</span> XMLRPC<span style="color: #339933;">::</span><span style="color: #004000;">Client</span><span style="color: #339933;">.</span>new3<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;http://site.ru/xml&quot;</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'login'</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'pass'</span><span style="color: #009900;">&#41;</span></pre></td></tr></table></div>

<p>Однако, на моем опыте не было случаев с базовой авторизацией в XML-RPC. Часто встречалось, что логин и пароль сували как параметры в сам запрос т.е. они были как параметры в запросном XML:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="php" style="font-family:monospace;">result <span style="color: #339933;">=</span> client<span style="color: #339933;">.</span>call<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;xmlrpc.cmd&quot;</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'login'</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'pass'</span><span style="color: #009900;">&#41;</span></pre></td></tr></table></div>

<p>На этом, если в ресурсе нет больше никаких примочек, в <code>result</code> будет уже хэш.</p>
<h2>base64</h2>
<p>Теперь рассмотрим вариант, если выходной XML зашифрован base64. Расшифровывать его можно так:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #b1b100;">require</span> <span style="color: #0000ff;">'base64'</span>
puts Base64<span style="color: #339933;">.</span>decode64<span style="color: #009900;">&#40;</span>result<span style="color: #009900;">&#41;</span></pre></td></tr></table></div>

<p>Однако, это не единственный вариант т.к. в библиотеке XMLRPC есть тоже класс для этого.<br />
Приведу еще пример, как вывести зашифрованный XML во временный файл, предварительно расшифровав.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #b1b100;">require</span> <span style="color: #0000ff;">'base64'</span>
<span style="color: #b1b100;">require</span> <span style="color: #0000ff;">'tempfile'</span>
&nbsp;
fl<span style="color: #339933;">=</span>Tempfile<span style="color: #339933;">.</span><span style="color: #000000; font-weight: bold;">new</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'xmlrpc'</span><span style="color: #009900;">&#41;</span>
fl<span style="color: #339933;">.</span><span style="color: #b1b100;">print</span> Base64<span style="color: #339933;">.</span>decode64<span style="color: #009900;">&#40;</span>result<span style="color: #009900;">&#41;</span>
fl<span style="color: #339933;">.</span>close</pre></td></tr></table></div>

<h2>gzip</h2>
<p>Как правило base64 просто так не используют т.к. с точки зрения криптографии он не реализует никакой стоящей защиты данных, а для приведения бинарника к текстовом виду он как раз подойдет.</p>
<p>В Zlib существует 2 метода для сжатия и распаковки строки:</p>
<ul>
<li><code>Zlib::Deflate.deflate(string, level)</code> &#8211; сжатие</li>
<li><code>Zlib::Inflate.inflate(string)</code> &#8211; распаковка</li>
</ul>
<p>Все было бы очень легко и просто, но к сожалению, Zlib::Inflate.inflate(string) не вернет нам распакованный XML-RPC ответ, единственное, что вы увидите:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="php" style="font-family:monospace;">`inflate<span style="color: #0000ff;">': incorrect header check (Zlib::DataError)</span></pre></td></tr></table></div>

<p>Собственно, поэтому нам и потребовалось записать расшифрованный base64 XML во временный файл, чтобы распаковать gzip другим способом:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #b1b100;">require</span> <span style="color: #0000ff;">'zlib'</span>
<span style="color: #b1b100;">include</span> Zlib
<span style="color: #339933;">...</span>
fl<span style="color: #339933;">=</span>Tempfile<span style="color: #339933;">.</span><span style="color: #000000; font-weight: bold;">new</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'xmlrpc'</span><span style="color: #009900;">&#41;</span>
fl<span style="color: #339933;">.</span><span style="color: #b1b100;">print</span> Base64<span style="color: #339933;">.</span>decode64<span style="color: #009900;">&#40;</span>result<span style="color: #009900;">&#41;</span>
fl<span style="color: #339933;">.</span>close
xmlrpc<span style="color: #339933;">=</span><span style="color: #0000ff;">''</span>
Zlib<span style="color: #339933;">::</span><span style="color: #004000;">GzipReader</span><span style="color: #339933;">.</span>open<span style="color: #009900;">&#40;</span>fl<span style="color: #339933;">.</span>path<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><span style="color: #339933;">|</span>gz<span style="color: #339933;">|</span> xmlrpc<span style="color: #339933;">=</span>gz<span style="color: #339933;">.</span>read<span style="color: #009900;">&#125;</span>
fl<span style="color: #339933;">.</span>close<span style="color: #009900;">&#40;</span><span style="color: #009900; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span></pre></td></tr></table></div>

<p><code>fl.close(true)</code> с флагом <code>true</code> удаляет временный файл.</p>
<h2>получение хэша их XML</h2>
<p>Вообще, существует миллион двести различных библиотек и классов для расхэширования XML, но я не буду проводить исследования и воспользуюсь, пусть и не самым быстрым, зато стандартным REXML.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #b1b100;">require</span> <span style="color: #0000ff;">'rexml/document'</span>
<span style="color: #b1b100;">include</span> REXML
<span style="color: #339933;">...</span>
xml<span style="color: #339933;">=</span>Document<span style="color: #339933;">.</span><span style="color: #000000; font-weight: bold;">new</span> xmlrpc</pre></td></tr></table></div>

<p>Все, теперь в переменной <code>xml</code> лежит хэш.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.lukmus.ru/2011/01/26/xml-rpcgzipbase64-na-ruby/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
