@@ -419,8 +419,17 @@ class MultipartFormData {
419419 var buffer = [ UInt8] ( repeating: 0 , count: streamBufferSize)
420420 let bytesRead = inputStream. read ( & buffer, maxLength: streamBufferSize)
421421
422- if let error = inputStream. streamError {
423- throw MultipartFormDataError . inputStreamReadFailed ( error: error)
422+ if bytesRead < 0 {
423+ if let error = inputStream. streamError {
424+ throw MultipartFormDataError . inputStreamReadFailed ( error: error)
425+ } else {
426+ throw MultipartFormDataError . inputStreamReadFailed (
427+ error: MultipartFormDataError . UnexpectedInputStreamLength (
428+ bytesExpected: bodyPart. bodyContentLength,
429+ bytesRead: UInt64 ( encoded. count)
430+ )
431+ )
432+ }
424433 }
425434
426435 if bytesRead > 0 {
@@ -474,9 +483,17 @@ class MultipartFormData {
474483 let bufferSize = min ( streamBufferSize, Int ( bytesLeftToRead) )
475484 var buffer = [ UInt8] ( repeating: 0 , count: bufferSize)
476485 let bytesRead = inputStream. read ( & buffer, maxLength: bufferSize)
477-
478- if let streamError = inputStream. streamError {
479- throw MultipartFormDataError . inputStreamReadFailed ( error: streamError)
486+ if bytesRead < 0 {
487+ if let streamError = inputStream. streamError {
488+ throw MultipartFormDataError . inputStreamReadFailed ( error: streamError)
489+ } else {
490+ throw MultipartFormDataError . inputStreamReadFailed (
491+ error: MultipartFormDataError . UnexpectedInputStreamLength (
492+ bytesExpected: bodyPart. bodyContentLength,
493+ bytesRead: bodyPart. bodyContentLength - bytesLeftToRead
494+ )
495+ )
496+ }
480497 }
481498
482499 if bytesRead > 0 {
@@ -514,8 +531,17 @@ class MultipartFormData {
514531 while bytesToWrite > 0 , outputStream. hasSpaceAvailable {
515532 let bytesWritten = outputStream. write ( buffer, maxLength: bytesToWrite)
516533
517- if let error = outputStream. streamError {
518- throw MultipartFormDataError . outputStreamWriteFailed ( error: error)
534+ if bytesWritten < 0 {
535+ if let error = outputStream. streamError {
536+ throw MultipartFormDataError . outputStreamWriteFailed ( error: error)
537+ } else {
538+ throw MultipartFormDataError . outputStreamWriteFailed (
539+ error: MultipartFormDataError . UnexpectedInputStreamLength (
540+ bytesExpected: UInt64 ( buffer. count) ,
541+ bytesRead: UInt64 ( buffer. count - bytesToWrite)
542+ )
543+ )
544+ }
519545 }
520546
521547 bytesToWrite -= bytesWritten
@@ -650,10 +676,10 @@ enum MultipartFormDataError: Error {
650676
651677 var underlyingError : ( any Error ) ? {
652678 switch self {
653- case let . bodyPartFileNotReachableWithError( _, error) ,
654- let . bodyPartFileSizeQueryFailedWithError( _, error) ,
655- let . inputStreamReadFailed( error) ,
656- let . outputStreamWriteFailed( error) :
679+ case . bodyPartFileNotReachableWithError( _, let error) ,
680+ . bodyPartFileSizeQueryFailedWithError( _, let error) ,
681+ . inputStreamReadFailed( let error) ,
682+ . outputStreamWriteFailed( let error) :
657683 error
658684
659685 case . bodyPartURLInvalid,
@@ -671,17 +697,17 @@ enum MultipartFormDataError: Error {
671697
672698 var url : URL ? {
673699 switch self {
674- case let . bodyPartURLInvalid( url) ,
675- let . bodyPartFilenameInvalid( url) ,
676- let . bodyPartFileNotReachable( url) ,
677- let . bodyPartFileNotReachableWithError( url, _) ,
678- let . bodyPartFileIsDirectory( url) ,
679- let . bodyPartFileSizeNotAvailable( url) ,
680- let . bodyPartFileSizeQueryFailedWithError( url, _) ,
681- let . bodyPartInputStreamCreationFailed( url) ,
682- let . outputStreamFileAlreadyExists( url) ,
683- let . outputStreamURLInvalid( url) ,
684- let . outputStreamCreationFailed( url) :
700+ case . bodyPartURLInvalid( let url) ,
701+ . bodyPartFilenameInvalid( let url) ,
702+ . bodyPartFileNotReachable( let url) ,
703+ . bodyPartFileNotReachableWithError( let url, _) ,
704+ . bodyPartFileIsDirectory( let url) ,
705+ . bodyPartFileSizeNotAvailable( let url) ,
706+ . bodyPartFileSizeQueryFailedWithError( let url, _) ,
707+ . bodyPartInputStreamCreationFailed( let url) ,
708+ . outputStreamFileAlreadyExists( let url) ,
709+ . outputStreamURLInvalid( let url) ,
710+ . outputStreamCreationFailed( let url) :
685711 url
686712
687713 case . inputStreamReadFailed, . outputStreamWriteFailed:
0 commit comments