diff --git a/lib/pages/home_page.dart b/lib/pages/home_page.dart index f6360dd75710ff78aa820b53e1ff9fa2c408d14f..4daeeec5760434fc1a60064232f81e4a954f97bf 100644 --- a/lib/pages/home_page.dart +++ b/lib/pages/home_page.dart @@ -1,5 +1,4 @@ import 'dart:async'; -import 'dart:io'; import 'package:flutter/material.dart'; @@ -48,7 +47,7 @@ class _HomePageState extends State<HomePage> { } void _showErrorDialog(String title, Object? error) { - stderr.write(error); + print(error); showDialog( context: context, builder: (context) => ErrorDialog(title: title, error: error), diff --git a/lib/untis/fetch.dart b/lib/untis/fetch.dart index c7a98cf6584b54ec5005851af2e63a7d29365d75..f40274589cc9f651f7b4f5edf7a82dc3220b1ccf 100644 --- a/lib/untis/fetch.dart +++ b/lib/untis/fetch.dart @@ -1,16 +1,18 @@ import 'dart:convert'; -import 'dart:io'; import 'package:flutter/foundation.dart'; +import 'package:http/http.dart' as http; import '../fetching/pageconfig.dart'; import '../fetching/timetable.dart'; import '../util/date_extension.dart'; -import 'class.dart'; import '../util/serializable.dart'; +import 'class.dart'; import 'element_type.dart'; import 'lecture.dart'; +typedef Cookie = (String key, String value); + typedef RequestOptions = (String path, String method, Json params); typedef RequestResult = (Json json, List<Cookie> cookies, FetchStats stats); @@ -22,7 +24,7 @@ class UntisFetch { 'traceId', }; - final HttpClient client = HttpClient(); + final http.Client client = http.Client(); final Uri serverHost = Uri.https('poly.webuntis.com'); final List<Cookie> _sessionCookies = []; @@ -63,12 +65,17 @@ class UntisFetch { ); } - Future<HttpClientResponse> _request(String method, Uri uri) async { - final request = await client.openUrl(method, uri); - request.cookies.add(Cookie('schoolname', idHsReutlingen)); + Future<http.StreamedResponse> _request(String method, Uri uri) async { + final request = http.Request(method, uri); - request.cookies.addAll(_sessionCookies); - final response = await request.close(); + final cookies = <Cookie>[]; + cookies.add(('schoolname', idHsReutlingen)); + cookies.addAll(_sessionCookies); + + request.headers['Set-Cookie'] = + cookies.map((cookie) => '${cookie.$1}=${cookie.$2}').join('; '); + + final response = await client.send(request); return response; } @@ -78,18 +85,23 @@ class UntisFetch { final onStart = DateTime.now(); final response = await _request(method, _makeUri(options)); - final cookies = response.cookies; + final cookieStrings = + response.headersSplitValues['Set-Cookie'] ?? <String>[]; + final cookies = cookieStrings + .map((cookieString) => cookieString.split('=')) + .map<Cookie>((parts) => (parts[0], parts[1])); + final resultCookies = <Cookie>[]; for (final cookie in cookies) { - if (_sessionCookieNames.contains(cookie.name)) { + if (_sessionCookieNames.contains(cookie.$1)) { resultCookies.add(cookie); } } final onDownloadStart = DateTime.now(); - final responseString = await utf8.decodeStream(response); + final responseString = await utf8.decodeStream(response.stream); final onDownloadEnd = DateTime.now(); if (response.statusCode != 200) {