Proxy xdmp:http-get()是否支持代理?

Proxy xdmp:http-get()是否支持代理?,proxy,marklogic,Proxy,Marklogic,请看下面的错误 尝试检索URL时遇到以下错误: 有人能帮我解决这个问题吗 谢谢 大家好 在我尝试了@mblakele告诉我的步骤之后,我仍然得到同样的回应 <response xmlns="xdmp:http"> <code>400</code> <message>Bad Request</message> <headers> <server>squid/3.1.4</server> &

请看下面的错误

尝试检索URL时遇到以下错误:

有人能帮我解决这个问题吗

谢谢

大家好

在我尝试了@mblakele告诉我的步骤之后,我仍然得到同样的回应

<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>
上述代码的$uri proxy的值:

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
上述代码中$options的值为:

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

www.austlii.edu.au
错误是

尝试检索URL时遇到以下错误:


我不认为有任何直接的支持,但可能会有所帮助

[编辑]由于该代码有一些问题,这里有一个简单的重写。这仍然不是完全通用的,但可能更容易调试和增强

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

因为我不能用
MarkLogic
处理代理。我开发了restapi,使用.NET通过代理隧道访问外部站点,并使用
MarkLogic
调用本地webservice

希望MarkLogic
http-get()
将来支持代理


感谢dev提出宝贵的建议。

我检查了这个问题,但我收到了错误的请求,因为ML数据库中的响应(如本文所述)尝试了一些调试。将查询修改为
return($host,$proxyuri)
,您应该看到
tokenize($uri,“/”)[last()]
太粗糙了。它会切断路径的
cgi-bin
部分。相反,新URI应该在主机之后包含所有内容。请参阅上面的编辑。我仍然收到一个错误的请求作为响应。匹配($proxy,“^\w+(:\d+?$”)这对我不起作用。因为在我的例子中localhost是ip,所以它与您编写的正则表达式不匹配。所以我去掉了那个部分,试了试。我在我的问题中发布了$uriproxy、$urihost、$options的值。请帮助我如何解决此问题
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/', ())