cURL没有URL设置


cURL No URL set

这个PHP允许用户提交带有二进制或纯文本URL的表单。然后将URL转换为纯文本,我使用cURL加载响应,然后将其转换回二进制。如果你想知道,它来自二进制翻译器,它可以翻译文本->二进制和二进制->文本,但也接受url。

问题:正如您所看到的,二进制url被翻译成文本,然后传递给cURL。明文保存在$newtext中。通过我所做的一些调试,我可以确认binaryToText()确实像宣传的那样工作。可以成功设置纯文本url(参见if语句的else部分),但不能设置转换后的二进制url。

$text = "http://google.co.uk";(isBinary($text) == false)

curl_setopt($ch, CURLOPT_URL, $text); <-有效

$text = "01101000011101000111010001110000001110100010111100101111011001110110111101101111011001110110110001100101001011100110001101101111001011100111010101101011"(相同的google url)(isBinary($text) == true)

$newtext = binaryToText($text);curl_setopt($ch, CURLOPT_URL, $newtext);

echo curl_error($ch); ->输出"No URL set!"

问题就在这里……我看不出来。

代码清单

$text = $_POST["text"];
if(startsWith($text, "http://") || startsWith($text, "https://") || startsWith($text, textToBinary("http://")) || startsWith($text, textToBinary("https://"))) {
  // URL - accepts binary (prefered), or plain text url; returns binary.
  $ch = curl_init();
  if(isBinary($text)) {
    $newtext = binaryToText($text);
    curl_setopt($ch, CURLOPT_URL, $newtext);
  } else {
    curl_setopt($ch, CURLOPT_URL, $text);
  }
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  curl_setopt($ch, CURLOPT_USERAGENT, "MY USERAGENT");
  if(isset($_GET["r"])) curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
  $result=curl_exec($ch);
  echo curl_error($ch);
  curl_close($ch);
  echo textToBinary($result);
} else if...

function isBinary($input) {
  return !preg_match('/[^(0|1)]/', $input); // contains nothing but 0 and 1
}
function binaryToText($input) {
  $return = '';
  $chars = explode("'n", chunk_split(str_replace("'n", '', $input), 8));
  $_I = count($chars);
  for($i = 0; $i < $_I; $return .= chr(bindec($chars[$i])), $i++);
  return $return;
}

编辑:$newtext的输出包含在此输出中:

text: 01101000011101000111010001110000001110100010111100101111011001110110111101101111011001110110110001100101001011100110001101101111001011100111010101101011
newtext: http://google.co.uk
No URL set!00000000
从这个:

if(isBinary($text)) {
  echo "text: ".$text."'n";
  $newtext = binaryToText($text);
  echo "newtext: ".$newtext."'n";
  curl_setopt($ch, CURLOPT_URL, $newtext);
} else {
  curl_setopt($ch, CURLOPT_URL, $text);
}

遍历代码并执行测试输出。

最有可能的情况是您的isBinary()函数出现故障。

使用

进行测试输出
print_r(isBinary($text))

查看返回值

解决了!

在我的$newtext变量中有一个NUL字节-所以当echo工作时,cURL不接受它作为一个有效的URL。我在binaryToText()方法中使用了以下代码行:

$return = str_replace("'0", "", $return);

""替换所有NUL字符。很高兴它有效!