@@ -783,6 +783,7 @@ function headObject(params, callback) {
783
783
* @param {Object } data 为对应的 object 数据,包括 body 和 headers
784
784
*/
785
785
function getObject ( params , callback ) {
786
+ var self = this ;
786
787
var headers = { } ;
787
788
var reqParams = { } ;
788
789
@@ -811,6 +812,47 @@ function getObject(params, callback) {
811
812
BodyType = util . isBrowser ? 'string' : 'buffer' ;
812
813
}
813
814
815
+ var onProgress = params . onProgress ;
816
+ var onDownloadProgress = ( function ( ) {
817
+ var time0 = Date . now ( ) ;
818
+ var size0 = 0 ;
819
+ var FinishSize = 0 ;
820
+ var FileSize = 0 ;
821
+ var progressTimer ;
822
+ var update = function ( ) {
823
+ progressTimer = 0 ;
824
+ if ( onProgress && ( typeof onProgress === 'function' ) ) {
825
+ var time1 = Date . now ( ) ;
826
+ var speed = parseInt ( ( FinishSize - size0 ) / ( ( time1 - time0 ) / 1000 ) * 100 ) / 100 || 0 ;
827
+ var percent = parseInt ( FinishSize / FileSize * 100 ) / 100 || 0 ;
828
+ time0 = time1 ;
829
+ size0 = FinishSize ;
830
+ try {
831
+ onProgress ( {
832
+ loaded : FinishSize ,
833
+ total : FileSize ,
834
+ speed : speed ,
835
+ percent : percent
836
+ } ) ;
837
+ } catch ( e ) {
838
+ }
839
+ }
840
+ } ;
841
+ return function ( info , immediately ) {
842
+ if ( info && info . loaded ) {
843
+ FinishSize = info . loaded ;
844
+ FileSize = info . total ;
845
+ }
846
+ if ( immediately ) {
847
+ clearTimeout ( progressTimer ) ;
848
+ update ( ) ;
849
+ } else {
850
+ if ( progressTimer ) return ;
851
+ progressTimer = setTimeout ( update , self . options . ProgressInterval || 1000 ) ;
852
+ }
853
+ } ;
854
+ } ) ( ) ;
855
+
814
856
// 如果用户自己传入了 output
815
857
submitRequest . call ( this , {
816
858
method : 'GET' ,
@@ -822,7 +864,9 @@ function getObject(params, callback) {
822
864
qs : reqParams ,
823
865
rawBody : true ,
824
866
outputStream : outputStream ,
867
+ onDownloadProgress : onDownloadProgress ,
825
868
} , function ( err , data ) {
869
+ onDownloadProgress ( null , true ) ;
826
870
if ( err ) {
827
871
var statusCode = err . statusCode ;
828
872
if ( headers [ 'If-Modified-Since' ] && statusCode && statusCode === 304 ) {
@@ -1740,56 +1784,80 @@ function submitRequest(params, callback) {
1740
1784
}
1741
1785
opt = util . clearKey ( opt ) ;
1742
1786
1743
- var sender = REQUEST ( opt , function ( err , response , body ) {
1744
-
1745
- // 返回内容添加 状态码 和 headers
1746
- var cb = function ( err , data ) {
1747
- if ( err ) {
1748
- err = err || { } ;
1749
- response && response . statusCode && ( err . statusCode = response . statusCode ) ;
1750
- callback ( err , null ) ;
1751
- } else {
1752
- data = data || { } ;
1753
- response && response . statusCode && ( data . statusCode = response . statusCode ) ;
1754
- response && response . headers && ( data . headers = response . headers ) ;
1755
- callback ( null , data ) ;
1756
- }
1757
- } ;
1758
-
1759
- // 请求错误,发生网络错误
1787
+ var sender = REQUEST ( opt ) ;
1788
+ var retResponse ;
1789
+ var hasReturned ;
1790
+ var cb = function ( err , data ) {
1791
+ if ( hasReturned ) return ;
1792
+ hasReturned = true ;
1760
1793
if ( err ) {
1761
- cb ( { error : err } ) ;
1762
- return ;
1794
+ err = err || { } ;
1795
+ retResponse && retResponse . statusCode && ( err . statusCode = retResponse . statusCode ) ;
1796
+ callback ( err , null ) ;
1797
+ } else {
1798
+ data = data || { } ;
1799
+ retResponse && retResponse . statusCode && ( data . statusCode = retResponse . statusCode ) ;
1800
+ retResponse && retResponse . headers && ( data . headers = retResponse . headers ) ;
1801
+ callback ( null , data ) ;
1763
1802
}
1764
-
1765
- var jsonRes ;
1803
+ } ;
1804
+ var xml2json = function ( body ) {
1766
1805
try {
1767
- jsonRes = util . xml2json ( body ) || { } ;
1806
+ json = util . xml2json ( body ) || { } ;
1768
1807
} catch ( e ) {
1769
- jsonRes = body || { } ;
1808
+ json = body || { } ;
1770
1809
}
1771
-
1772
- // 请求返回码不为 200
1810
+ return json ;
1811
+ } ;
1812
+ sender . on ( 'error' , function ( err ) {
1813
+ cb ( { error : err } ) ;
1814
+ } ) ;
1815
+ sender . on ( 'response' , function ( response ) {
1816
+ retResponse = response ;
1817
+ var contentLength = response . headers [ 'content-length' ] || 0 ;
1773
1818
var statusCode = response . statusCode ;
1774
- if ( statusCode !== 200 && statusCode !== 204 && statusCode !== 206 ) {
1775
- cb ( { error : jsonRes . Error || jsonRes } ) ;
1776
- return ;
1777
- }
1778
-
1779
- // 不对 body 进行转换,body 直接挂载返回
1780
- if ( rawBody ) {
1781
- jsonRes = { } ;
1782
- jsonRes . body = body ;
1783
- }
1784
-
1785
- if ( jsonRes . Error ) {
1786
- cb ( { error : jsonRes . Error } ) ;
1787
- return ;
1819
+ var chunkList = [ ] ;
1820
+ var statusSuccess = statusCode === 200 || statusCode === 204 || statusCode === 206 ;
1821
+ if ( statusSuccess && params . outputStream ) {
1822
+ sender . on ( 'end' , function ( ) {
1823
+ cb ( null , { } ) ;
1824
+ } ) ;
1825
+ } else if ( contentLength >= process . binding ( 'buffer' ) . kMaxLength ) {
1826
+ cb ( { error : 'file size large than ' + process . binding ( 'buffer' ) . kMaxLength + ', please use "Output" Stream to getObject.' } ) ;
1827
+ } else {
1828
+ sender . on ( 'data' , function ( chunk ) {
1829
+ chunkList . push ( chunk ) ;
1830
+ } ) ;
1831
+ sender . on ( 'end' , function ( ) {
1832
+ var json ;
1833
+ try {
1834
+ var body = Buffer . concat ( chunkList ) ;
1835
+ } catch ( e ) {
1836
+ cb ( { error : e } ) ;
1837
+ return ;
1838
+ }
1839
+ if ( statusSuccess ) {
1840
+ if ( rawBody ) { // 不对 body 进行转换,body 直接挂载返回
1841
+ cb ( null , { body : body } ) ;
1842
+ } else if ( body . length ) {
1843
+ json = xml2json ( body . toString ( ) ) ;
1844
+ if ( json && json . Error ) {
1845
+ cb ( { error : json . Error } ) ;
1846
+ } else {
1847
+ cb ( null , json ) ;
1848
+ }
1849
+ } else {
1850
+ cb ( null , { } ) ;
1851
+ }
1852
+ } else {
1853
+ json = xml2json ( body . toString ( ) ) ;
1854
+ cb ( { error : json && json . Error || json } ) ;
1855
+ }
1856
+ } ) ;
1788
1857
}
1789
- cb ( null , jsonRes ) ;
1790
1858
} ) ;
1791
1859
1792
- // progress
1860
+ // upload progress
1793
1861
if ( params . onProgress && typeof params . onProgress === 'function' ) {
1794
1862
var contentLength = opt . headers [ 'Content-Length' ] ;
1795
1863
var time0 = Date . now ( ) ;
@@ -1814,6 +1882,30 @@ function submitRequest(params, callback) {
1814
1882
} ) ;
1815
1883
} ) ;
1816
1884
}
1885
+ // download progress
1886
+ if ( params . onDownloadProgress && typeof params . onDownloadProgress === 'function' ) {
1887
+ var time0 = Date . now ( ) ;
1888
+ var size0 = 0 ;
1889
+ var loaded = 0 ;
1890
+ var total = 0 ;
1891
+ sender . on ( 'response' , function ( res ) {
1892
+ total = res . headers [ 'content-length' ] ;
1893
+ sender . on ( 'data' , function ( chunk ) {
1894
+ loaded += chunk . length ;
1895
+ var time1 = Date . now ( ) ;
1896
+ var speed = parseInt ( ( loaded - size0 ) / ( ( time1 - time0 ) / 1000 ) * 100 ) / 100 ;
1897
+ var percent = total ? ( parseInt ( loaded / total * 100 ) / 100 ) : 0 ;
1898
+ time0 = time1 ;
1899
+ size0 = loaded ;
1900
+ params . onDownloadProgress ( {
1901
+ loaded : loaded ,
1902
+ total : total ,
1903
+ speed : speed ,
1904
+ percent : percent ,
1905
+ } ) ;
1906
+ } ) ;
1907
+ } ) ;
1908
+ }
1817
1909
1818
1910
// pipe 输入
1819
1911
if ( params . inputStream ) {
0 commit comments