}
} while (curl_errno($ch) == CURLE_OPERATION_TIMEDOUT && ++$attempt < Tweeper::$maxConnectionRetries);
+ $response_code = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);
+ if (FALSE === $response_code) {
+ trigger_error(curl_error($ch), E_USER_WARNING);
+ return FALSE;
+ }
+
+ if ($response_code >= 400) {
+ trigger_error("HTTP reponse code $response_code", E_USER_WARNING);
+ return FALSE;
+ }
+
return $ret;
}
$data = json_decode($matches[1], $assoc = TRUE);
- // The "qe" object contains elements which will result in invalid XML
- // element names, so remove it.
+ // Remove items that may contain elements which can result in invalid XML
+ // element names (for example names starting with a number).
unset($data["qe"]);
-
- // The "knobs" object contains elements with undefined namespaces, so
- // remove it to silence an error message.
- unset($data["knobs"]);
+ unset($data["knobx"]);
+ unset($data["to_cache"]);
+
+ // Stop here in case Instagram redirected to the login page, this can
+ // happen when too many consecutive requests have been made from the same
+ // IP.
+ if (array_key_exists("LoginAndSignupPage", $data["entry_data"])) {
+ trigger_error("Cannot open instagram page: redirected to Login page.\n", E_USER_WARNING);
+ return NULL;
+ }
$json = json_encode($data);
$get_xml_host_method = 'getXml' . Tweeper::toUpperCamelCase($host, '.');
if (method_exists($this, $get_xml_host_method)) {
$xml_data = call_user_func_array([$this, $get_xml_host_method], [$html]);
+ if (NULL === $xml_data) {
+ return NULL;
+ }
$xmlDoc->loadXML($xml_data);
}
else {