Kdyby/Curl vs PHP cURL – rozdielne odpovede na rovnaky request

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
flipis
Člen | 12
+
0
-

Zdravim, viete mi niekto povedat, ci (a aky) je rozdiel medzi tymito dvoma kodmi?

1)

$request = new Request($url);

$request->headers['Accept'] = 'application/json';
$request->headers['Content-Type'] = 'application/json';
$request->options['USERPWD'] = $this->username . ':' . $this->password;

$response = $request->post(Json::encode($params))->getResponse();

2)

$request = curl_init($url);

$headers= array('Accept: application/json','Content-Type: application/json');
curl_setopt($request, CURLOPT_HTTPHEADER, $headers);
curl_setopt($request, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($request, CURLOPT_POST, TRUE);
curl_setopt($request, CURLOPT_POSTFIELDS, Json::encode($params));
curl_setopt($request, CURLOPT_USERPWD, $this->username . ':' . $this->password );

$response = curl_exec($request);

Totizto zatial co ten druhy prechadza bez problemov (vracia HTTP 200 a odpoved v tvare aky ocakavam), ten prvy mi vyhadzuje vynimku 403 Forbidden a vracia chybovu odpoved {"_system_":{"errors":{"_system_":["Agent_id neodpovídá žádosti!"]}}}. Ta znamena, ze system nedokazal identifikovat Agent_id, ktore sa posiela v requeste v ramci JSON pola. Napadlo ma iba to, ze nevie ten JSON precitat, ale netusim preco. Neda sa mi pozriet, ake data prichadzaju na server druhej strany, pretoze k nemu nemam pristup. Niekto nejake napady? Vdaka.

EDIT:

V call stacku som prehliadol jednu vec – request v skutocnosti prejde, aj vrati to, co ma, ale potom sa kontroluje IsForcingFollowRedirect a ten vyhodnoti, ze sa ma redirectnut dalej, pricom nastavi prazdne data (teraz uz ta chyba dava zmysel). Da sa to nejakym sposobom vypnut? Nieco na sposob

curl_setopt($request, CURLOPT_FOLLOWLOCATION, FALSE);

Skusal som

$request->options['FOLLOWLOCATION'] = FALSE;

nepomohlo.

Editoval flipis (28. 7. 2015 16:48)

srigi
Nette Blogger | 558
+
0
-

Skus sniffovat localhosta cez konzolu. Mam definovane taketo dva aliasy. Ten prvy by mal ficat iba na MacOS, ten druhy uz aj na linuxe.

alias sniff="sudo ngrep -d 'lo0' -t '^(DELETE|GET|OPTIONS|POST|PUT) ' 'tcp and port 80'"
alias httpdump="sudo tcpdump -i en1 -n -s 0 -w - | grep -a -o -E \"Host\: .*|GET \/.*\""

A prekrokuj si kod toho nefunkcneho riesenia. Nastavit si krokovanie je vec na tri minuty.

Editoval srigi (21. 7. 2015 16:51)

Unlink
Člen | 298
+
0
-

Alebo si to pošli na nejakú svoj skript :)

flipis
Člen | 12
+
0
-

Editoval som otazku, kukni pls.

flipis
Člen | 12
+
0
-

Pozri pls EDIT otazky.

Unlink
Člen | 298
+
0
-

A prečo ten server na ktorý to posielaš vracia location header? To by logicky nemalo, či?

No a ako to fixnuť, hm
https://github.com/…rlSender.php#L445
tuto to je zakomentované, takže kto vie prečo.

Fixneš to nejako takto

$sender = new CurlSender();
$sender->setConfirmRedirect(function() { return false; });
$request = new Request($url);

$request->headers['Accept'] = 'application/json';
$request->headers['Content-Type'] = 'application/json';
$request->options['USERPWD'] = $this->username . ':' . $this->password;

$response = $sender->send($request->setPost(Json::encode($params)))->getResponse();
flipis
Člen | 12
+
0
-

preco vracia Location Header to netusim…tiez si myslim, ze by nemalo, ale nemam na to dosah…ja som len dostal dokumentaciu a podla nej to napajam…
dik za tip na fix, vyskusam…ale pride mi to trochu krkolomne, tiez by ma zaujimalo, preco je ten riadok zakomentovany…ten by top vpodstate krasne vyriesil