Skip to content

Commit 35b562f

Browse files
committed
First implementation for parse-community#366
1 parent 23f911e commit 35b562f

20 files changed

+215
-142
lines changed

lib/parse_server_sdk.dart

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,8 @@ import 'dart:typed_data';
88
import 'dart:ui' as ui;
99

1010
import 'package:devicelocale/devicelocale.dart';
11+
import 'package:dio/dio.dart';
1112
import 'package:flutter/foundation.dart' show kIsWeb;
12-
import 'package:http/http.dart';
13-
import 'package:http/io_client.dart';
1413
import 'package:meta/meta.dart';
1514
import 'package:package_info/package_info.dart';
1615
import 'package:path/path.dart' as path;
@@ -21,6 +20,8 @@ import 'package:shared_preferences/shared_preferences.dart';
2120
import 'package:uuid/uuid.dart';
2221
import 'package:xxtea/xxtea.dart';
2322

23+
import 'src/network/http_client_adapter.dart';
24+
2425
export 'src/network/parse_live_query.dart'
2526
if (dart.library.js) 'src/network/parse_live_query_web.dart';
2627
export 'src/utils/parse_live_list.dart';
@@ -141,8 +142,8 @@ class Parse {
141142
const ParseApiRQ type = ParseApiRQ.healthCheck;
142143

143144
try {
144-
final Response response =
145-
await _client.get('${ParseCoreData().serverUrl}$keyEndPointHealth');
145+
final Response<String> response = await _client
146+
.get<String>('${ParseCoreData().serverUrl}$keyEndPointHealth');
146147
parseResponse =
147148
handleResponse<Parse>(null, response, type, _debug, className);
148149
} on Exception catch (e) {
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
export 'http_client_adapter_native.dart'
2+
if (dart.library.js) 'http_client_adapter_web.dart';
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import 'dart:io';
2+
3+
import 'package:dio/adapter.dart';
4+
import 'package:dio/dio.dart';
5+
6+
HttpClientAdapter createHttpClientAdapter(SecurityContext securityContext) {
7+
final DefaultHttpClientAdapter defaultHttpClientAdapter =
8+
DefaultHttpClientAdapter();
9+
10+
if (securityContext != null)
11+
defaultHttpClientAdapter.onHttpClientCreate =
12+
(HttpClient client) => HttpClient(context: securityContext);
13+
return defaultHttpClientAdapter;
14+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import 'dart:io';
2+
3+
import 'package:dio/adapter_browser.dart';
4+
import 'package:dio/dio.dart';
5+
6+
HttpClientAdapter createHttpClientAdapter(SecurityContext securityContext) {
7+
final BrowserHttpClientAdapter browserHttpClientAdapter =
8+
BrowserHttpClientAdapter();
9+
return browserHttpClientAdapter;
10+
}
Lines changed: 44 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,46 +1,64 @@
11
part of flutter_parse_sdk;
22

33
/// Creates a custom version of HTTP Client that has Parse Data Preset
4-
class ParseHTTPClient extends BaseClient {
5-
ParseHTTPClient({bool sendSessionId = false, SecurityContext securityContext})
6-
: _sendSessionId = sendSessionId,
7-
_client = securityContext != null
8-
? IOClient(HttpClient(context: securityContext))
9-
: Client();
10-
11-
final Client _client;
12-
final bool _sendSessionId;
4+
class ParseHTTPClient with DioMixin implements Dio {
5+
ParseHTTPClient({
6+
this.sendSessionId = false,
7+
SecurityContext securityContext,
8+
}) {
9+
options = BaseOptions();
10+
httpClientAdapter = createHttpClientAdapter(securityContext);
11+
}
12+
13+
final bool sendSessionId;
14+
Map<String, String> additionalHeaders;
15+
1316
final String _userAgent = '$keyLibraryName $keySdkVersion';
1417
ParseCoreData data = ParseCoreData();
15-
Map<String, String> additionalHeaders;
1618

17-
/// Overrides the call method for HTTP Client and adds custom headers
1819
@override
19-
Future<StreamedResponse> send(BaseRequest request) {
20+
Future<Response<T>> request<T>(
21+
String path, {
22+
dynamic data,
23+
Map<String, dynamic> queryParameters,
24+
CancelToken cancelToken,
25+
Options options,
26+
ProgressCallback onSendProgress,
27+
ProgressCallback onReceiveProgress,
28+
}) {
29+
options ??= Options();
2030
if (!identical(0, 0.0)) {
21-
request.headers[keyHeaderUserAgent] = _userAgent;
31+
options.headers[keyHeaderUserAgent] = _userAgent;
2232
}
23-
request.headers[keyHeaderApplicationId] = data.applicationId;
24-
if ((_sendSessionId == true) &&
25-
(data.sessionId != null) &&
26-
(request.headers[keyHeaderSessionToken] == null))
27-
request.headers[keyHeaderSessionToken] = data.sessionId;
33+
options.headers[keyHeaderApplicationId] = this.data.applicationId;
34+
if ((sendSessionId == true) &&
35+
(this.data.sessionId != null) &&
36+
(options.headers[keyHeaderSessionToken] == null))
37+
options.headers[keyHeaderSessionToken] = this.data.sessionId;
2838

29-
if (data.clientKey != null)
30-
request.headers[keyHeaderClientKey] = data.clientKey;
31-
if (data.masterKey != null)
32-
request.headers[keyHeaderMasterKey] = data.masterKey;
39+
if (this.data.clientKey != null)
40+
options.headers[keyHeaderClientKey] = this.data.clientKey;
41+
if (this.data.masterKey != null)
42+
options.headers[keyHeaderMasterKey] = this.data.masterKey;
3343

3444
/// If developer wants to add custom headers, extend this class and add headers needed.
3545
if (additionalHeaders != null && additionalHeaders.isNotEmpty) {
3646
additionalHeaders
37-
.forEach((String key, String value) => request.headers[key] = value);
47+
.forEach((String key, String value) => options.headers[key] = value);
3848
}
3949

40-
if (data.debug) {
41-
logCUrl(request);
50+
if (this.data.debug) {
51+
logCUrl(options, data, path);
4252
}
4353

44-
return _client.send(request);
54+
return super.request(
55+
path,
56+
data: data,
57+
queryParameters: queryParameters,
58+
cancelToken: cancelToken,
59+
options: options,
60+
onSendProgress: onSendProgress,
61+
onReceiveProgress: onReceiveProgress,
62+
);
4563
}
4664
}

lib/src/objects/parse_config.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ class ParseConfig extends ParseObject {
1616
Future<ParseResponse> getConfigs() async {
1717
try {
1818
final String uri = '${ParseCoreData().serverUrl}/config';
19-
final Response result = await _client.get(uri);
19+
final Response<String> result = await _client.get<String>(uri);
2020
return handleResponse<ParseConfig>(
2121
this, result, ParseApiRQ.getConfigs, _debug, parseClassName);
2222
} on Exception catch (e) {
@@ -29,7 +29,7 @@ class ParseConfig extends ParseObject {
2929
try {
3030
final String uri = '${ParseCoreData().serverUrl}/config';
3131
final String body = '{\"params\":{\"$key\": \"${parseEncode(value)}\"}}';
32-
final Response result = await _client.put(uri, body: body);
32+
final Response<String> result = await _client.put<String>(uri, data: body);
3333
return handleResponse<ParseConfig>(
3434
this, result, ParseApiRQ.addConfig, _debug, parseClassName);
3535
} on Exception catch (e) {

lib/src/objects/parse_file.dart

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,8 @@ class ParseFile extends ParseFileBase {
5050
final Directory tempPath = await getTemporaryDirectory();
5151
file = File('${tempPath.path}/$name');
5252
await file.create();
53-
final Response response = await _client.get(url);
54-
await file.writeAsBytes(response.bodyBytes);
53+
final Response<List<int>> response = await _client.get<List<int>>(url, options: Options(responseType: ResponseType.bytes));
54+
await file.writeAsBytes(response.data);
5555

5656
return this;
5757
}
@@ -67,7 +67,7 @@ class ParseFile extends ParseFileBase {
6767
};
6868
return handleResponse<ParseFile>(
6969
this,
70-
Response(json.encode(response), 201),
70+
Response<String>(data: json.encode(response), statusCode: 201),
7171
ParseApiRQ.upload,
7272
_debug,
7373
parseClassName);
@@ -80,10 +80,10 @@ class ParseFile extends ParseFileBase {
8080
try {
8181
final String uri = _client.data.serverUrl + '$_path';
8282
final List<int> body = await file.readAsBytes();
83-
final Response response =
84-
await _client.post(uri, headers: headers, body: body);
83+
final Response<String> response = await _client.post<String>(uri,
84+
options: Options(headers: headers), data: body);
8585
if (response.statusCode == 201) {
86-
final Map<String, dynamic> map = json.decode(response.body);
86+
final Map<String, dynamic> map = json.decode(response.data);
8787
url = map['url'].toString();
8888
name = map['name'].toString();
8989
}

lib/src/objects/parse_file_web.dart

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,9 @@ class ParseWebFile extends ParseFileBase {
2323
return this;
2424
}
2525

26-
final Response response = await _client.get(url);
27-
file = response.bodyBytes;
26+
final Response<List<int>> response = await _client.get<List<int>>(url,
27+
options: Options(responseType: ResponseType.bytes));
28+
file = response.data;
2829

2930
return this;
3031
}
@@ -39,7 +40,7 @@ class ParseWebFile extends ParseFileBase {
3940
};
4041
return handleResponse<ParseWebFile>(
4142
this,
42-
Response(json.encode(response), 201),
43+
Response<String>(data: json.encode(response), statusCode: 201),
4344
ParseApiRQ.upload,
4445
_debug,
4546
parseClassName);
@@ -52,10 +53,10 @@ class ParseWebFile extends ParseFileBase {
5253
};
5354
try {
5455
final String uri = _client.data.serverUrl + '$_path';
55-
final Response response =
56-
await _client.post(uri, headers: headers, body: file);
56+
final Response<String> response = await _client.post<String>(uri,
57+
options: Options(headers: headers), data: file);
5758
if (response.statusCode == 201) {
58-
final Map<String, dynamic> map = json.decode(response.body);
59+
final Map<String, dynamic> map = json.decode(response.data);
5960
url = map['url'].toString();
6061
name = map['name'].toString();
6162
}

lib/src/objects/parse_function.dart

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,9 @@ class ParseCloudFunction extends ParseObject {
3333
_setObjectData(parameters);
3434
}
3535

36-
final Response result = await _client.post(uri,
37-
headers: headers, body: json.encode(_getObjectData()));
36+
final Response<String> result = await _client.post<String>(uri,
37+
options: Options(headers: headers),
38+
data: json.encode(_getObjectData()));
3839
return handleResponse<ParseCloudFunction>(
3940
this, result, ParseApiRQ.execute, _debug, parseClassName);
4041
}
@@ -48,8 +49,9 @@ class ParseCloudFunction extends ParseObject {
4849
if (parameters != null) {
4950
_setObjectData(parameters);
5051
}
51-
final Response result = await _client.post(uri,
52-
headers: headers, body: json.encode(_getObjectData()));
52+
final Response<String> result = await _client.post<String>(uri,
53+
options: Options(headers: headers),
54+
data: json.encode(_getObjectData()));
5355
return handleResponse<T>(this, result, ParseApiRQ.executeObjectionFunction,
5456
_debug, parseClassName);
5557
}

lib/src/objects/parse_installation.dart

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,8 @@ class ParseInstallation extends ParseObject {
8383
}
8484

8585
//Locale
86-
final String locale = kIsWeb ? ui.window.locale.toString() : await Devicelocale.currentLocale;
86+
final String locale =
87+
kIsWeb ? ui.window.locale.toString() : await Devicelocale.currentLocale;
8788
if (locale != null && locale.isNotEmpty) {
8889
set<String>(keyLocaleIdentifier, locale);
8990
}
@@ -175,13 +176,13 @@ class ParseInstallation extends ParseObject {
175176
ParseApiRQ.create.toString(), uri, body);
176177
}
177178

178-
final Response result =
179-
await _client.post(uri, body: body, headers: headers);
179+
final Response<String> result = await _client.post<String>(uri,
180+
data: body, options: Options(headers: headers));
180181

181182
//Set the objectId on the object after it is created.
182183
//This allows you to perform operations on the object after creation
183184
if (result.statusCode == 201) {
184-
final Map<String, dynamic> map = json.decode(result.body);
185+
final Map<String, dynamic> map = json.decode(result.data);
185186
objectId = map['objectId'].toString();
186187
}
187188

@@ -205,7 +206,8 @@ class ParseInstallation extends ParseObject {
205206
logRequest(ParseCoreData().appName, parseClassName,
206207
ParseApiRQ.save.toString(), uri, body);
207208
}
208-
final Response result = await _client.put(uri, body: body);
209+
final Response<String> result =
210+
await _client.put<String>(uri, data: body);
209211
return handleResponse<ParseInstallation>(
210212
this, result, ParseApiRQ.save, _debug, parseClassName);
211213
} on Exception catch (e) {

0 commit comments

Comments
 (0)