protected function putFile(File $file, $locationUri) { try { $response = $this->api->request($locationUri, 'PUT', ['Content-Type' => 'text/csv', 'Content-Length' => $file->getSize()], ['body' => \GuzzleHttp\Psr7\stream_for(fopen($file->getPathname(), 'r'))]); } catch (BadResponseException $e) { $response = $e->getResponse(); if ($response->getStatusCode() >= 300) { // get upload status $response = $this->api->request($locationUri, 'PUT', ['Content-Type' => 'text/csv', 'Content-Length' => 0, 'Content-Range' => 'bytes */*']); $i = 0; $maxTries = 7; while ($response->getStatusCode() == 308 && $i < $maxTries) { $range = explode('-', $response->getHeaderLine('Range')); $remainingSize = $file->getSize() - $range[1] + 1; // ffwd to byte where we left of $fh = fopen($file->getPathname(), 'r'); fseek($fh, $range[1] + 1); $response = $this->api->request($locationUri, 'PUT', ['Content-Length' => $remainingSize, 'Content-Range' => sprintf('bytes %s/%s', $range[1] + 1, $file->getSize())], ['body' => \GuzzleHttp\Psr7\stream_for($fh)]); sleep(pow(2, $i)); $i++; } } } if ($response->getStatusCode() >= 300) { throw new ApplicationException("Error on PUT file", null, ['statusCode' => $response->getStatusCode(), 'reason' => $response->getReasonPhrase(), 'responseBody' => $response->getBody()]); } return json_decode($response->getBody(), true); }