Skip to content

Commit a2e1017

Browse files
committed
feat: contentLength
1 parent b53d201 commit a2e1017

File tree

3 files changed

+24
-9
lines changed

3 files changed

+24
-9
lines changed

src/request.android.ts

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { File, HttpResponseEncoding, ImageSource, Utils } from '@nativescript/core';
2-
import { CacheOptions, HttpsFormDataParam, HttpsRequest, HttpsRequestOptions, HttpsResponseLegacy, HttpsSSLPinningOptions } from '.';
2+
import { CacheOptions, HttpsFormDataParam, HttpsRequest, HttpsRequestOptions, HttpsSSLPinningOptions, HttpsResponseLegacy as IHttpsResponseLegacy } from '.';
33

44
import { getFilenameFromUrl, interceptors, networkInterceptors, parseJSON } from './request.common';
55
export { addNetworkInterceptor, addInterceptor } from './request.common';
@@ -41,10 +41,13 @@ export function clearCache() {
4141

4242
let _timeout = 10;
4343

44-
class HttpsResponseLegacyIOS implements HttpsResponseLegacy {
44+
class HttpsResponseLegacy implements IHttpsResponseLegacy {
4545
private callback?: com.nativescript.https.OkHttpResponse.OkHttpResponseAsyncCallback;
4646
constructor(private response: com.nativescript.https.OkHttpResponse, private tag: string, private url: string) {}
4747

48+
get contentLength() {
49+
return this.response.contentLength();
50+
}
4851
getOrCreateCloseCallback() {
4952
if (!notClosedResponses[this.tag]) {
5053
// we need to store handling request to be able to cancel them
@@ -440,7 +443,11 @@ export function createRequest(opts: HttpsRequestOptions, useLegacy: boolean = tr
440443
const MEDIA_TYPE = okhttp3.MediaType.parse(param.contentType);
441444
builder.addFormDataPart(param.parameterName, param.fileName, okhttp3.RequestBody.create(MEDIA_TYPE, param.data));
442445
} else {
443-
builder.addFormDataPart(param.parameterName, param.data);
446+
if (typeof param.data === 'string') {
447+
builder.addFormDataPart(param.parameterName, param.data);
448+
} else {
449+
builder.addFormDataPart(param.parameterName, param.data + '');
450+
}
444451
}
445452
});
446453
okHttpBody = builder.build();
@@ -520,7 +527,8 @@ export function createRequest(opts: HttpsRequestOptions, useLegacy: boolean = tr
520527

521528
resolve({
522529
response,
523-
content: new HttpsResponseLegacyIOS(nResponse, tag, opts.url),
530+
content: new HttpsResponseLegacy(nResponse, tag, opts.url),
531+
contentLength: nResponse.contentLength(),
524532
statusCode,
525533
reason: message,
526534
get headers() {
@@ -531,6 +539,7 @@ export function createRequest(opts: HttpsRequestOptions, useLegacy: boolean = tr
531539
resolve({
532540
response,
533541
content: responseBody.string(),
542+
contentLength: responseBody.contentLength(),
534543
reason: message,
535544
statusCode,
536545
get headers() {

src/request.d.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ export interface HttpsRequestOptions extends HttpRequestOptions {
6262
export interface HttpsResponse<T = any> {
6363
headers?: Headers;
6464
statusCode?: number;
65+
contentLength: number;
6566
content?: T;
6667
reason?: string;
6768
description?: string;
@@ -76,6 +77,7 @@ export interface HttpsRequest {
7677
}
7778

7879
export interface HttpsResponseLegacy<T = any> {
80+
contentLength: number;
7981
toArrayBuffer(): ArrayBuffer;
8082
toArrayBufferAsync(): Promise<ArrayBuffer>;
8183

src/request.ios.ts

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { File, ImageSource, Utils } from '@nativescript/core';
2-
import { CacheOptions, HttpsFormDataParam, HttpsRequest, HttpsRequestOptions, HttpsResponse, HttpsResponseLegacy, HttpsSSLPinningOptions } from '.';
2+
import { CacheOptions, HttpsFormDataParam, HttpsRequest, HttpsRequestOptions, HttpsResponse, HttpsSSLPinningOptions, HttpsResponseLegacy as IHttpsResponseLegacy } from '.';
33
import { getFilenameFromUrl, parseJSON } from './request.common';
44
export { addInterceptor, addNetworkInterceptor } from './request.common';
55

@@ -90,9 +90,9 @@ function getData(data) {
9090
return content;
9191
}
9292

93-
class HttpsResponseLegacyAndroid implements HttpsResponseLegacy {
93+
class HttpsResponseLegacy implements IHttpsResponseLegacy {
9494
// private callback?: com.nativescript.https.OkhttpResponse.OkHttpResponseAsyncCallback;
95-
constructor(private data: NSDictionary<string, any> & NSData & NSArray<any>, private url: string) {}
95+
constructor(private data: NSDictionary<string, any> & NSData & NSArray<any>, public contentLength, private url: string) {}
9696
toArrayBufferAsync(): Promise<ArrayBuffer> {
9797
throw new Error('Method not implemented.');
9898
}
@@ -230,6 +230,7 @@ function AFFailure(resolve, reject, task: NSURLSessionDataTask, error: NSError,
230230
let getHeaders = () => ({});
231231
const sendi = ({
232232
task,
233+
contentLength: task.countOfBytesReceived,
233234
reason: error.localizedDescription,
234235
get headers() {
235236
return getHeaders();
@@ -265,11 +266,12 @@ function AFFailure(resolve, reject, task: NSURLSessionDataTask, error: NSError,
265266
failure.description = '@nativescript-community/https > Invalid SSL certificate! ' + error.description;
266267
}
267268
sendi.failure = failure;
268-
sendi.content = new HttpsResponseLegacyAndroid(data, url);
269+
sendi.content = new HttpsResponseLegacy(data, sendi.contentLength, url);
269270
resolve(sendi);
270271
} else {
271272
const content: any = {
272273
body: parsedData,
274+
contentLength: sendi.contentLength,
273275
description: error.description,
274276
reason: error.localizedDescription,
275277
url: failingURL ? failingURL.description : url,
@@ -379,10 +381,12 @@ export function createRequest(opts: HttpsRequestOptions, useLegacy: boolean = tr
379381
const success = function (task: NSURLSessionDataTask, data?: any) {
380382
clearRunningRequest();
381383
// TODO: refactor this code with failure one.
382-
const content = useLegacy ? new HttpsResponseLegacyAndroid(data, opts.url) : getData(data);
384+
const contentLength = task.countOfBytesReceived;
385+
const content = useLegacy ? new HttpsResponseLegacy(data, contentLength, opts.url) : getData(data);
383386
let getHeaders = () => ({});
384387
const sendi = ({
385388
content,
389+
contentLength,
386390
get headers() {
387391
return getHeaders();
388392
},

0 commit comments

Comments
 (0)