2014-11-17 2 views
2
xdmp:http-get($url, 
    <options xmlns="xdmp:document-get"> 
     <format>binary</format> 
    </options>)[2] 

Привет всем,Будет ли xdmp: http-get() поддерживать прокси?

выше запрос не возвращает ответ от прокси-сервера. Я знал IP-адрес и номер порта, чтобы получить ответ на прокси-сервере. Кто-нибудь знает, где добавить IP-адрес и номер порта?

MarkLogic Версия: 7.x

Недавно я попытался настроить прокси-сервер, как описано в http://markmail.org/message/sbfj44jtmpsyopyh на код ниже.

let $proxy := "http://171.21.15.60:3128" 
let $uri := "http://www.austlii.edu.au/cgi-bin/sinosrch.cgi?results=200;query=damage" 
let $host := tokenize($uri,'/')[3] 
let $proxyuri := concat($proxy, '/', tokenize($uri, '/')[last()]) 
return xdmp:http-post(
    $proxyuri, 
    <options xmlns="xdmp:http"> 
    <headers> 
     <Host>{$host}</Host>   
    </headers> 
    </options> 
) 

Но я получил плохую просьбу в качестве ответа.

<response xmlns="xdmp:http"> 
<code>400</code> 
<message>Bad Request</message> 
<headers> 
    <server>squid/3.1.4</server> 
    <mime-version>1.0</mime-version> 
    <date>Thu, 20 Nov 2014 04:09:50 GMT</date> 
    <content-type>text/html</content-type> 
    <content-length>3071</content-length> 
    <x-squid-error>ERR_INVALID_URL 0</x-squid-error> 
    <vary>Accept-Language</vary> 
    <content-language>en</content-language> 
    <x-cache>MISS from l076ddms1</x-cache> 
    <x-cache-lookup>NONE from l076ddms1:3128</x-cache-lookup> 
    <via>1.0 l076ddms1 (squid/3.1.4)</via> 
    <proxy-connection>close</proxy-connection> 
</headers> 
</response> 

Посмотрите на ниже ошибки

Следующая ошибка при попытке получить URL: /sinosrch.cgi?results=200;query=damage

Может кто-нибудь помочь мне с этим вопросом?

Спасибо.

Привет всем,

я все еще получаю тот же ответ после того, как я попытался шаги, рассказанные @mblakele.

declare namespace http="xdmp:http"; 

declare function local:http-options(
    $options as element(http:options)?, 
    $extra as element(http:options)?) 
as element()? 
{ 
    if (empty($extra)) then $options 
    else if (empty($options)) then $extra 
    else element http:options { 
    (: TODO - needs to handle conflicting options. :) 
    $options/*, 
    $extra/* } 
}; 

declare function local:http-get(
    $proxy as xs:string, 
    $uri as xs:string, 
    $options as element(http:options)?) 
as item()+ 
{ 

    let $uri-toks := tokenize($uri, '/+') 
    let $uri-host := $uri-toks[2] 
    let $options := local:http-options(
    $options, 
    element http:options { 
     element http:headers { 
     element http:host { $uri-host } } }) 
    (: TODO support TLS proxies using https. :) 
    let $uri-proxy := concat(
    'http://', $proxy, 
    substring-after($uri, $uri-host)) 
    return xdmp:http-get($uri-proxy, $options) 
}; 

local:http-get(
    '171.21.15.60:3128', 'http://www.austlii.edu.au/cgi-bin/sinosrch.cgi?results=200;query=damage',()) 

значение $ Uri-прокси кода выше:

http://171.21.15.60:3128/cgi-bin/sinosrch.cgi?results=200;query=damage 

Значение $ Ури ополчением выше код:

www.austlii.edu.au 

Значение $ в приведенном выше кодексе:

<http:options xmlns:http="xdmp:http">  
<http:headers>  
<http:host>www.austlii.edu.au</http:host> 
</http:headers></http:options> 

ошибка

Следующая ошибка при попытке получить URL: /cgi-bin/sinosrch.cgi?results=200;query=damage

ответ

0

Поскольку я не могу обрабатывать прокси-сервер с MarkLogic. Я разработал REST API с использованием . NET для доступа к внешнему сайту через прокси-туннель, и я сделал MarkLogic для вызова моего локального веб-сервиса.

Hope MarkLogic http-get() будет поддерживать прокси в будущем.

Спасибо, что за ценное предложение.

1

Я не думаю, что есть какая-либо прямая поддержка, но http://markmail.org/message/sbfj44jtmpsyopyh может помочь.

[EDIT] Поскольку этот код имеет некоторые проблемы, вот простой переписать. Это все еще не полностью универсально, но его легче отлаживать и улучшать.

declare namespace http="xdmp:http" ; 

declare function local:http-options(
    $options as element(http:options)?, 
    $extra as element(http:options)?) 
as element()? 
{ 
    if (empty($extra)) then $options 
    else if (empty($options)) then $extra 
    else element http:options { 
    (: TODO - needs to handle conflicting options. :) 
    $options/*, 
    $extra/* } 
}; 

declare function local:http-get(
    $proxy as xs:string, 
    $uri as xs:string, 
    $options as element(http:options)?) 
as item()+ 
{ 
    let $_ := (
    if (matches($proxy, '^\w+(:\d+)?$')) then() 
    else error(
    (), 'BADPROXY', 
     ('Must be a string host:port', xdmp:describe($proxy)))) 
    let $uri-toks := tokenize($uri, '/+') 
    let $uri-host := $uri-toks[2] 
    let $options := local:http-options(
    $options, 
    element http:options { 
     element http:headers { 
     element http:host { $uri-host } } }) 
    (: TODO support TLS proxies using https. :) 
    let $uri-proxy := concat(
    'http://', $proxy, 
    substring-after($uri, $uri-host)) 
    return xdmp:http-get($uri-proxy, $options) 
}; 

local:http-get(
    'localhost:8118', 'http://www.google.com/',()) 
+0

Я проверил это [ссылка] (http://markmail.org/message/sbfj44jtmpsyopyh), но я получил неверный запрос в качестве ответа (как указано в вопросе) в базе данных ML – Gowtham

+0

Попробуйте выполнить некоторую отладку. Измените запрос на 'return ($ host, $ proxyuri)', и вы увидите, что 'tokenize ($ uri, '/') [last()]' слишком грубо. Он отсекает часть 'cgi-bin' пути. Вместо этого новый URI должен иметь все * после * хоста. См. Мое редактирование, выше. – mblakele

+0

Я все еще получаю плохую просьбу в качестве ответа. match ($ proxy, '^ \ w + (: \ d +)? $') это не будет работать для меня. потому что localhost является ip в моем случае, он не будет соответствовать регулярному выражению, которое вы пишете. Поэтому я удалил эту часть и попытался. В моем вопросе я отправил значение $ uri-proxy, $ uri-host, $ options. Помогите мне решить эту проблему – Gowtham

Смежные вопросы