|
37 | 37 | use EbicsApi\Ebics\Models\Crypt\KeyPair; |
38 | 38 | use EbicsApi\Ebics\Models\DownloadSegment; |
39 | 39 | use EbicsApi\Ebics\Models\DownloadTransaction; |
| 40 | +use EbicsApi\Ebics\Models\EmptyOrderData; |
40 | 41 | use EbicsApi\Ebics\Models\Http\Request; |
41 | 42 | use EbicsApi\Ebics\Models\Http\Response; |
42 | 43 | use EbicsApi\Ebics\Models\InitializationSegment; |
@@ -222,9 +223,19 @@ function (UploadTransaction $transaction) use ($order) { |
222 | 223 | $order->setTransaction($transaction); |
223 | 224 | $orderData = $order->getOrderData(); |
224 | 225 | $this->schemaValidator->validate($orderData); |
225 | | - $transaction->setOrderData($orderData->getContent()); |
226 | | - $transaction->setNumSegments($orderData->getContent() == ' ' ? 0 : 1); |
227 | | - $transaction->setDigest($this->cryptService->hash($transaction->getOrderData())); |
| 226 | + |
| 227 | + if ($orderData->getContent() === EmptyOrderData::CONTENT) { |
| 228 | + $transaction->setOrderData([$orderData->getContent()]); |
| 229 | + $transaction->setNumSegments(0); |
| 230 | + } else { |
| 231 | + $orderDataChunks = []; |
| 232 | + for ($i = 0; $i < strlen($orderData->getContent()); $i += UploadTransaction::CHUNK_SIZE) { |
| 233 | + $orderDataChunks[] = substr($orderData->getContent(), $i, UploadTransaction::CHUNK_SIZE); |
| 234 | + } |
| 235 | + $transaction->setOrderData($orderDataChunks); |
| 236 | + $transaction->setNumSegments(count($orderDataChunks)); |
| 237 | + } |
| 238 | + $transaction->setDigest($this->cryptService->hash($orderData->getContent())); |
228 | 239 |
|
229 | 240 | return $order->createRequest(); |
230 | 241 | } |
@@ -482,21 +493,23 @@ private function uploadTransaction(callable $requestClosure): UploadTransaction |
482 | 493 | $uploadSegment = $this->responseHandler->extractUploadSegment($request, $response); |
483 | 494 | $transaction->setInitialization($uploadSegment); |
484 | 495 |
|
485 | | - // Segments can be many but requires realization of buffering. |
486 | | - if ($transaction->getNumSegments() === 1) { |
487 | | - $segment = $this->segmentFactory->createTransferSegment(); |
488 | | - $segment->setTransactionKey($transaction->getKey()); |
489 | | - $segment->setSegmentNumber(1); |
490 | | - $segment->setIsLastSegment(true); |
491 | | - $segment->setNumSegments($transaction->getNumSegments()); |
492 | | - $segment->setOrderData($transaction->getOrderData()); |
493 | | - $segment->setTransactionId($transaction->getInitialization()->getTransactionId()); |
494 | | - |
495 | | - if ($segment->getTransactionId()) { |
496 | | - $transaction->addSegment($segment); |
497 | | - $transaction->setKey($segment->getTransactionId()); |
498 | | - $this->transferTransfer($transaction); |
| 496 | + if ($transaction->getNumSegments() > 0) { |
| 497 | + foreach ($transaction->getOrderData() as $orderDataChunkId => $orderDataChunk) { |
| 498 | + $segment = $this->segmentFactory->createTransferSegment(); |
| 499 | + $segment->setTransactionKey($transaction->getKey()); |
| 500 | + $segment->setSegmentNumber($orderDataChunkId + 1); |
| 501 | + $segment->setIsLastSegment($segment->getSegmentNumber() === $transaction->getNumSegments()); |
| 502 | + $segment->setOrderData($orderDataChunk); |
| 503 | + |
| 504 | + $segment->setNumSegments($transaction->getNumSegments()); |
| 505 | + $segment->setTransactionId($transaction->getInitialization()->getTransactionId()); |
| 506 | + |
| 507 | + if ($segment->getTransactionId()) { |
| 508 | + $transaction->addSegment($segment); |
| 509 | + } |
499 | 510 | } |
| 511 | + |
| 512 | + $this->transferTransfer($transaction); |
500 | 513 | } |
501 | 514 |
|
502 | 515 | return $transaction; |
|
0 commit comments