@@ -2638,5 +2638,101 @@ describe('gcs-resumable-upload', () => {
26382638 upstreamBuffer . pipe ( up ) ;
26392639 } ) ;
26402640 } ) ;
2641+
2642+ describe ( 'empty object' , ( ) => {
2643+ let uri = '' ;
2644+
2645+ beforeEach ( ( ) => {
2646+ uri = 'uri' ;
2647+
2648+ up . contentLength = 0 ;
2649+ up . createURI = (
2650+ callback : ( error : Error | null , uri : string ) => void
2651+ ) => {
2652+ up . uri = uri ;
2653+ up . offset = 0 ;
2654+ callback ( null , uri ) ;
2655+ } ;
2656+ } ) ;
2657+
2658+ it ( 'should support uploading empty objects' , done => {
2659+ const CONTENT_LENGTH = 0 ;
2660+ const EXPECTED_NUM_REQUESTS = 1 ;
2661+
2662+ const upstreamBuffer = new Readable ( {
2663+ read ( ) {
2664+ this . push ( null ) ;
2665+ } ,
2666+ } ) ;
2667+
2668+ const requests : {
2669+ dataReceived : number ;
2670+ opts : GaxiosOptions ;
2671+ chunkWritesInRequest : number ;
2672+ } [ ] = [ ] ;
2673+ let overallDataReceived = 0 ;
2674+
2675+ up . makeRequestStream = async ( opts : GaxiosOptions ) => {
2676+ let dataReceived = 0 ;
2677+ let chunkWritesInRequest = 0 ;
2678+
2679+ const res = await new Promise ( resolve => {
2680+ opts . body . on ( 'data' , ( data : Buffer ) => {
2681+ dataReceived += data . byteLength ;
2682+ overallDataReceived += data . byteLength ;
2683+ chunkWritesInRequest ++ ;
2684+ } ) ;
2685+
2686+ opts . body . on ( 'end' , ( ) => {
2687+ requests . push ( { dataReceived, opts, chunkWritesInRequest} ) ;
2688+
2689+ resolve ( {
2690+ status : 200 ,
2691+ data : { } ,
2692+ } ) ;
2693+
2694+ resolve ( null ) ;
2695+ } ) ;
2696+ } ) ;
2697+
2698+ return res ;
2699+ } ;
2700+
2701+ up . on ( 'error' , done ) ;
2702+
2703+ up . on ( 'finish' , ( ) => {
2704+ // Ensure the correct number of requests and data look correct
2705+ assert . equal ( requests . length , EXPECTED_NUM_REQUESTS ) ;
2706+ assert . equal ( overallDataReceived , CONTENT_LENGTH ) ;
2707+
2708+ // Validate the single request
2709+ const request = requests [ 0 ] ;
2710+
2711+ assert . strictEqual ( request . opts . method , 'PUT' ) ;
2712+ assert . strictEqual ( request . opts . url , uri ) ;
2713+
2714+ // We should be writing multiple chunks down the wire
2715+ assert ( request . chunkWritesInRequest === 0 ) ;
2716+
2717+ assert . equal ( request . dataReceived , CONTENT_LENGTH ) ;
2718+ assert ( request . opts . headers ) ;
2719+
2720+ assert . equal (
2721+ request . opts . headers [ 'Content-Range' ] ,
2722+ `bytes 0-*/${ CONTENT_LENGTH } `
2723+ ) ;
2724+ assert . ok (
2725+ X_GOOG_API_HEADER_REGEX . test (
2726+ request . opts . headers [ 'x-goog-api-client' ]
2727+ )
2728+ ) ;
2729+
2730+ done ( ) ;
2731+ } ) ;
2732+
2733+ // init the request
2734+ upstreamBuffer . pipe ( up ) ;
2735+ } ) ;
2736+ } ) ;
26412737 } ) ;
26422738} ) ;
0 commit comments