0

I am using Guzzle 3.8.1 with CakePHP 2.5.6 and I am making a call to the Box API. I would like to be able to refresh my access token when it expires. The issue I am encountering is that I may be using any one of N possible access tokens and I want to be able to use the $account_id that is in scope for the function I am defining this in. I don't see how I can pass it into the Listener defined function, since I am not calling that myself. I do see that the expired access_token exists in the $event variable, but I would have to locate it and then parse it from the header that I am passing to Box. I think I could add a custom header containing the account_id, but that seems like a bad way to approach the problem. Can I somehow specify a variable in the request that wouldn't be added as part of the call to Box? Any suggestions are much appreciated, thanks!

`

public function get_folder_list ($account_id = null, $parent_folder_id = null) {
    // Get account
    $this->Account = ClassRegistry::init('Account');
    $account = $this->Account->findById($account_id);
    $this->Account->log($account);

    // If account doesn't exist, throw error
    if(empty($account)) {
        throw new NotFoundException(__('Account id not found: ' . $account_id));
    }

    // Call Box for folder list
    $box_url = "https://api.box.com/2.0/folders/";
    if (empty($parent_folder_id)) {
        $box_url .= "0";
    } else {
        $box_url .= $parent_folder_id;
    }
    $this->Account->log($box_url);
    $bearer = 'Bearer ' . $account['Account']['access_token'];
    $client = new Guzzle\Http\Client();

    $client->getEventDispatcher()->addListener('request.error', function(Event $event) {
        if ($event['response']->getStatusCode() == 401) {
            $Account = new Account;
            $Account->log($event);
            $Box = new BoxLib;                
            $account = $Box->refresh_token($account_id);
            $bearer = 'Bearer ' . $account['Account']['access_token'];
            $request = $client->get($box_url, array('Authorization' => $bearer));
            $event['response'] = $newResponse;

            $event->stopPropagation();
        }
    });
    $request = $client->get($box_url, array('Authorization' => $bearer));

     try {
        $response = $request->send();
     } catch (Guzzle\Http\Exception\BadResponseException $e) {
        // HTTP codes 4xx and 5xx throw BadResponseException
        $this->Account->log('Service exception!');
        $this->Account->log('Uh oh! ' . $e->getMessage());
        $this->Account->log('HTTP request URL: ' . $e->getRequest()->getUrl() . "\n");
        $this->Account->log('HTTP request: ' . $e->getRequest() . "\n");
        $this->Account->log('HTTP response status: ' . $e->getResponse()->getStatusCode() . "\n");
        $this->Account->log('HTTP response: ' . $e->getResponse() . "\n");            
     }

    $this->Account->log($response->json());
    $json = $response->json();

    $folder_list = array();
    foreach ($json['item_collection']['entries'] as $folder) {
        $folder_list[$folder['id']] = $folder['name'];
    }       
    //$this->Account->log($folder_list);

    return $folder_list;
}

`

  • Could you please shorten your code to the relevant parts or at least show where sour code fails? As of now, I don't really understand where you're problem is (although I have a feeling it might be solve by closures - see http://stackoverflow.com/q/1065188/413531 :)) – Hirnhamster Apr 12 '15 at 11:22
  • It really comes down to this line: $account = $Box->refresh_token($account_id); The $account_id is out of scope. After a quick look, it seems like you are right that closures should take care of it. I'll try and make time to go back and try that (I've since then just done a workaround and moved on). Thanks! – George Campbell Apr 13 '15 at 13:44

0 Answers0