7

While trying to use cUrl with the Post method in Yii 2, I receive a 400 error code.

Bad Request (#400)
Unable to verify your data submission.
The above error occurred while the Web server was processing your request.

Please contact us if you think this is a server error. Thank you.

This is my code, where i instantiate the CurlTool class:

public function actionSend() {
        $model = new \app\models\Licitatie;
        if ($model->load(Yii::$app->request->post())) {
            $curl_tool = new \common\components\CurlTool();
            $result = $curl_tool->fetchContent('http://www.william.ro/licitatia_bursa/frontend/web/index.php/organizator/licitatie/evrika', $model->attributes);
            print_r($result);
        }
    }

    public function actionEvrika() {
        return json_encode(
                array(
                    'a' => 'b',
                )
        );
    }

this is the curltool class code:

<?php

namespace common\components;

class CurlTool {

    public static $userAgents = array(
        'FireFox3' => 'Mozilla/5.0 (Windows; U; Windows NT 5.1; pl; rv:1.9) Gecko/2008052906 Firefox/3.0',
        'GoogleBot' => 'Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)',
        'IE7' => 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)',
        'Netscape' => 'Mozilla/4.8 [en] (Windows NT 6.0; U)',
        'Opera' => 'Opera/9.25 (Windows NT 6.0; U; en)'
    );
    public static $options = array(
        CURLOPT_USERAGENT => 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)',
        CURLOPT_AUTOREFERER => true,
        CURLOPT_FOLLOWLOCATION => false,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_FRESH_CONNECT => true,
        CURLOPT_COOKIEJAR => "cookies.txt",
        CURLOPT_COOKIEFILE => "cookies.txt",
        CURLOPT_SSL_VERIFYPEER => false,
            //CURLOPT_COOKIESESSION => false,
    );
    private static $proxyServers = array();
    private static $proxyCount = 0;
    private static $currentProxyIndex = 0;
    public static $getinfo;

    public static function addProxyServer($url) {
        self::$proxyServers[] = $url;
        ++self::$proxyCount;
    }

    public static function fetchContent($url, $fields = null, $verbose = false) {
        //print '*'.$fields.'*';
        if (($curl = curl_init($url)) == false) {
            throw new Exception("curl_init error for url $url.");
        }
        if (self::$proxyCount > 0) {
            $proxy = self::$proxyServers[self::$currentProxyIndex++ % self::$proxyCount];
            curl_setopt($curl, CURLOPT_PROXY, $proxy);
            if ($verbose === true) {
                echo "Reading $url [Proxy: $proxy] ... ";
            }
        } else if ($verbose === true) {
            echo "Reading $url ... ";
        }
        //$verbose=TRUE;
        //print_r($fields);
//        debug_print_backtrace();
//url-ify the data for the POST
        $fields_string = '';
        if (is_array($fields))
            foreach ($fields as $key => $value) {
                if (empty($key))
                    continue;
                $fields_string .= $key . '=' . urlencode($value) . '&';
                if ($verbose === true) {
                    echo $key . ": " . $value;
                }
            }
        rtrim($fields_string, '&');

        if (count($fields) > 0) {
            curl_setopt($curl, CURLOPT_POST, count($fields));
            curl_setopt($curl, CURLOPT_POSTFIELDS, $fields_string);
        }

        if ($verbose === true) {
            echo "Fields string $fields_string ... ";
        }

        curl_setopt_array($curl, self::$options);

        $content = curl_exec($curl);
        self::$getinfo = curl_getinfo($curl);
        if ($content === false) {
            throw new Exception("curl_exec error for url $url " . curl_error($curl));
        }

        curl_close($curl);
        if ($verbose === true) {
            echo "Done.\n";
        }
        $content = preg_replace('#\n+#', ' ', $content);
        $content = preg_replace('#\s+#', ' ', $content);

        return $content;
    }

}
1

3 Answers 3

15
class Controller extends \yii\base\Controller
{
    /**
     * @var boolean whether to enable CSRF validation for the actions in this controller.
     * CSRF validation is enabled only when both this property and [[Request::enableCsrfValidation]] are true.
     */
    public $enableCsrfValidation = false; <- set this to false

...

be careful, i just found out that if this setting is used within the action itself, it might fail;

it might fail within beforeaction;

Sign up to request clarification or add additional context in comments.

Comments

4

you can disable csrf in beforeaction

public function beforeAction($action)
{
    if($action->id == 'source-in')
    {
        return true;
    }
    return parent::beforeAction($action);
}

Comments

0

Is there another way to fix it? Maybe generate a new CSRF token and send it in the POST data?

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.