Feature/middlewares #9
							
								
								
									
										149
									
								
								packages/wyatt_http_client/example/pipeline.dart
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										149
									
								
								packages/wyatt_http_client/example/pipeline.dart
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,149 @@ | ||||
| // ignore_for_file: public_member_api_docs, sort_constructors_first | ||||
| // Copyright (C) 2022 WYATT GROUP | ||||
| // Please see the AUTHORS file for details. | ||||
| // | ||||
| // This program is free software: you can redistribute it and/or modify | ||||
| // it under the terms of the GNU General Public License as published by | ||||
| // the Free Software Foundation, either version 3 of the License, or | ||||
| // any later version. | ||||
| // | ||||
| // This program is distributed in the hope that it will be useful, | ||||
| // but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||||
| // GNU General Public License for more details. | ||||
| // | ||||
| // You should have received a copy of the GNU General Public License | ||||
| // along with this program. If not, see <https://www.gnu.org/licenses/>. | ||||
| 
 | ||||
| import 'package:wyatt_http_client/src/middleware_client.dart'; | ||||
| import 'package:wyatt_http_client/src/middlewares/body_to_json_middleware.dart'; | ||||
| import 'package:wyatt_http_client/src/middlewares/refresh_token_middleware.dart'; | ||||
| import 'package:wyatt_http_client/src/middlewares/simple_logger_middleware.dart'; | ||||
| import 'package:wyatt_http_client/src/middlewares/uri_prefix_middleware.dart'; | ||||
| import 'package:wyatt_http_client/src/pipeline.dart'; | ||||
| import 'package:wyatt_http_client/src/utils/protocols.dart'; | ||||
| 
 | ||||
| // class RequestMutatorMiddleware implements Middleware { | ||||
| //   @override | ||||
| //   Middleware? parent; | ||||
| 
 | ||||
| //   @override | ||||
| //   Middleware? child; | ||||
| 
 | ||||
| //   RequestMutatorMiddleware({ | ||||
| //     this.parent, | ||||
| //     this.child, | ||||
| //   }); | ||||
| 
 | ||||
| //   @override | ||||
| //   BaseRequest onRequest(BaseRequest request) { | ||||
| //     print('RequestMutator::OnRequest: ${request.method} -> ${request.url}'); | ||||
| //     return child?.onRequest(request) ?? request; | ||||
| //   } | ||||
| 
 | ||||
| //   @override | ||||
| //   BaseResponse onResponse(BaseResponse response) { | ||||
| //     final res = child?.onResponse(response) ?? response; | ||||
| //     print( | ||||
| //       'RequestMutator::OnResponse: ${res.statusCode} -> ${res.contentLength} bytes', | ||||
| //     ); | ||||
| //     return res; | ||||
| //   } | ||||
| // } | ||||
| 
 | ||||
| // typedef Middleware = Handler Function(Handler innerHandler); | ||||
| 
 | ||||
| // Middleware createMiddleware({ | ||||
| //   FutureOr<Response?> Function(Request)? requestHandler, | ||||
| //   FutureOr<Response> Function(Response)? responseHandler, | ||||
| //   FutureOr<Response> Function(Object error, StackTrace)? errorHandler, | ||||
| // }) { | ||||
| //   requestHandler ??= (request) => null; | ||||
| //   responseHandler ??= (response) => response; | ||||
| 
 | ||||
| //   FutureOr<Response> Function(Object, StackTrace)? onError; | ||||
| //   if (errorHandler != null) { | ||||
| //     onError = (error, stackTrace) { | ||||
| //       if (error is Exception) throw error; | ||||
| //       return errorHandler(error, stackTrace); | ||||
| //     }; | ||||
| //   } | ||||
| 
 | ||||
| //   return (Handler innerHandler) { | ||||
| //     return (request) { | ||||
| //       return Future.sync(() => requestHandler!(request)).then((response) { | ||||
| //         if (response != null) return response; | ||||
| 
 | ||||
| //         return Future.sync(() => innerHandler(request)) | ||||
| //             .then((response) => responseHandler!(response), onError: onError); | ||||
| //       }); | ||||
| //     }; | ||||
| //   }; | ||||
| // } | ||||
| 
 | ||||
| // extension MiddlewareX on Middleware { | ||||
| //   Middleware addMiddleware(Middleware other) => | ||||
| //       (Handler handler) => this(other(handler)); | ||||
| //   Handler addHandler(Handler handler) => this(handler); | ||||
| // } | ||||
| 
 | ||||
| // typedef Handler = FutureOr<Response> Function(Request request); | ||||
| 
 | ||||
| // final headerMutator = createMiddleware( | ||||
| //   responseHandler: (response) { | ||||
| //     print(response.headers); | ||||
| //     return response; | ||||
| //   },); | ||||
| 
 | ||||
| // class Pipeline { | ||||
| //   const Pipeline(); | ||||
| 
 | ||||
| //   Pipeline addMiddleware(Middleware middleware) => | ||||
| //       _Pipeline(middleware, addHandler); | ||||
| 
 | ||||
| //   Handler addHandler(Handler handler) => handler; | ||||
| 
 | ||||
| //   Middleware get middleware => addHandler; | ||||
| // } | ||||
| 
 | ||||
| // class _Pipeline extends Pipeline { | ||||
| //   final Middleware _middleware; | ||||
| //   final Middleware _parent; | ||||
| 
 | ||||
| //   _Pipeline(this._middleware, this._parent); | ||||
| 
 | ||||
| //   @override | ||||
| //   Handler addHandler(Handler handler) => _parent(_middleware(handler)); | ||||
| // } | ||||
| 
 | ||||
| Future<void> main(List<String> args) async { | ||||
|   final Pipeline pipeline1 = Pipeline() | ||||
|       .addMiddleware(SimpleLoggerMiddleware()) | ||||
|       .addMiddleware( | ||||
|         UriPrefixMiddleware( | ||||
|           protocol: Protocols.http, | ||||
|           authority: 'localhost:80', | ||||
|         ), | ||||
|       ) | ||||
|       .addMiddleware(BodyToJsonMiddleware()); | ||||
| 
 | ||||
|   final Pipeline pipeline2 = Pipeline().addMiddleware( | ||||
|     RefreshTokenMiddleware( | ||||
|       authorizationEndpoint: | ||||
|           'http://localhost:80/api/v1/account/test?action=authorize', | ||||
|       tokenEndpoint: 'http://localhost:80/api/v1/account/test?action=refresh', | ||||
|       innerClientMiddlewares: pipeline1.middleware, | ||||
|     ), | ||||
|   ); | ||||
| 
 | ||||
|   final Pipeline pipeline = pipeline1 + pipeline2; | ||||
| 
 | ||||
|   print(pipeline.getLogic()); | ||||
|   final client = MiddlewareClient(pipeline); | ||||
|   final r = await client.post( | ||||
|     Uri.parse('/api/v1/account/test'), | ||||
|     body: <String, String>{ | ||||
|       'email': 'test@test.fr', | ||||
|     }, | ||||
|   ); | ||||
| } | ||||
							
								
								
									
										77
									
								
								packages/wyatt_http_client/lib/src/middleware.dart
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										77
									
								
								packages/wyatt_http_client/lib/src/middleware.dart
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,77 @@ | ||||
| // Copyright (C) 2022 WYATT GROUP | ||||
| // Please see the AUTHORS file for details. | ||||
| // | ||||
| // This program is free software: you can redistribute it and/or modify | ||||
| // it under the terms of the GNU General Public License as published by | ||||
| // the Free Software Foundation, either version 3 of the License, or | ||||
| // any later version. | ||||
| // | ||||
| // This program is distributed in the hope that it will be useful, | ||||
| // but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||||
| // GNU General Public License for more details. | ||||
| // | ||||
| // You should have received a copy of the GNU General Public License | ||||
| // along with this program. If not, see <https://www.gnu.org/licenses/>. | ||||
| 
 | ||||
| import 'package:http/http.dart'; | ||||
| import 'package:wyatt_http_client/src/middleware_client.dart'; | ||||
| import 'package:wyatt_http_client/src/models/middleware_request.dart'; | ||||
| import 'package:wyatt_http_client/src/models/middleware_response.dart'; | ||||
| 
 | ||||
| class Middleware { | ||||
|   Middleware? child; | ||||
| 
 | ||||
|   MiddlewareClient? _client; | ||||
| 
 | ||||
|   Middleware({ | ||||
|     this.child, | ||||
|   }); | ||||
| 
 | ||||
|   Middleware._({ | ||||
|     this.child, | ||||
|     MiddlewareClient? client, | ||||
|   }) : _client = client; | ||||
| 
 | ||||
|   String getName() => 'Middleware'; | ||||
| 
 | ||||
|   void setClient(MiddlewareClient? client) { | ||||
|     _client = client; | ||||
|     child?.setClient(client); | ||||
|   } | ||||
| 
 | ||||
|   Client? getClient() { | ||||
|     return _client?.inner; | ||||
|   } | ||||
| 
 | ||||
|   Middleware deepCopy() { | ||||
|     if (child != null) { | ||||
|       return Middleware._(child: child?.deepCopy(), client: _client); | ||||
|     } else { | ||||
|       return Middleware._(client: _client); | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   void addChild(Middleware middleware) { | ||||
|     if (child != null) { | ||||
|       child?.addChild(middleware); | ||||
|     } else { | ||||
|       child = middleware; | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   MiddlewareRequest onRequest( | ||||
|     MiddlewareRequest request, | ||||
|   ) { | ||||
|     return child?.onRequest(request) ?? request; | ||||
|   } | ||||
| 
 | ||||
|   MiddlewareResponse onResponse(MiddlewareResponse response) { | ||||
|     return child?.onResponse(response) ?? response; | ||||
|   } | ||||
| 
 | ||||
|   @override | ||||
|   String toString() { | ||||
|     return getName(); | ||||
|   } | ||||
| } | ||||
							
								
								
									
										117
									
								
								packages/wyatt_http_client/lib/src/middleware_client.dart
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										117
									
								
								packages/wyatt_http_client/lib/src/middleware_client.dart
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,117 @@ | ||||
| // Copyright (C) 2022 WYATT GROUP | ||||
| // Please see the AUTHORS file for details. | ||||
| // | ||||
| // This program is free software: you can redistribute it and/or modify | ||||
| // it under the terms of the GNU General Public License as published by | ||||
| // the Free Software Foundation, either version 3 of the License, or | ||||
| // any later version. | ||||
| // | ||||
| // This program is distributed in the hope that it will be useful, | ||||
| // but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||||
| // GNU General Public License for more details. | ||||
| // | ||||
| // You should have received a copy of the GNU General Public License | ||||
| // along with this program. If not, see <https://www.gnu.org/licenses/>. | ||||
| 
 | ||||
| import 'dart:convert'; | ||||
| 
 | ||||
| import 'package:http/http.dart'; | ||||
| import 'package:wyatt_http_client/src/middleware.dart'; | ||||
| import 'package:wyatt_http_client/src/models/middleware_request.dart'; | ||||
| import 'package:wyatt_http_client/src/models/middleware_response.dart'; | ||||
| import 'package:wyatt_http_client/src/models/unfreezed_request.dart'; | ||||
| import 'package:wyatt_http_client/src/pipeline.dart'; | ||||
| 
 | ||||
| class MiddlewareClient extends BaseClient { | ||||
|   final Client inner; | ||||
|   final Middleware middleware; | ||||
|   final Pipeline pipeline; | ||||
| 
 | ||||
|   MiddlewareClient( | ||||
|     this.pipeline, { | ||||
|     Middleware? middleware, | ||||
|     Client? inner, | ||||
|   })  : inner = inner ?? Client(), | ||||
|         middleware = middleware ?? pipeline.middleware { | ||||
|     this.middleware.setClient(this); | ||||
|   } | ||||
| 
 | ||||
|   @override | ||||
|   Future<Response> head(Uri url, {Map<String, String>? headers}) => | ||||
|       _sendUnstreamed('HEAD', url, headers); | ||||
| 
 | ||||
|   @override | ||||
|   Future<Response> get(Uri url, {Map<String, String>? headers}) => | ||||
|       _sendUnstreamed('GET', url, headers); | ||||
| 
 | ||||
|   @override | ||||
|   Future<Response> post( | ||||
|     Uri url, { | ||||
|     Map<String, String>? headers, | ||||
|     Object? body, | ||||
|     Encoding? encoding, | ||||
|   }) => | ||||
|       _sendUnstreamed('POST', url, headers, body, encoding); | ||||
| 
 | ||||
|   @override | ||||
|   Future<Response> put( | ||||
|     Uri url, { | ||||
|     Map<String, String>? headers, | ||||
|     Object? body, | ||||
|     Encoding? encoding, | ||||
|   }) => | ||||
|       _sendUnstreamed('PUT', url, headers, body, encoding); | ||||
| 
 | ||||
|   @override | ||||
|   Future<Response> patch( | ||||
|     Uri url, { | ||||
|     Map<String, String>? headers, | ||||
|     Object? body, | ||||
|     Encoding? encoding, | ||||
|   }) => | ||||
|       _sendUnstreamed('PATCH', url, headers, body, encoding); | ||||
| 
 | ||||
|   @override | ||||
|   Future<Response> delete( | ||||
|     Uri url, { | ||||
|     Map<String, String>? headers, | ||||
|     Object? body, | ||||
|     Encoding? encoding, | ||||
|   }) => | ||||
|       _sendUnstreamed('DELETE', url, headers, body, encoding); | ||||
| 
 | ||||
|   @override | ||||
|   Future<StreamedResponse> send(BaseRequest request) { | ||||
|     return inner.send(request); | ||||
|   } | ||||
| 
 | ||||
|   Future<Response> _sendUnstreamed( | ||||
|     String method, | ||||
|     Uri url, | ||||
|     Map<String, String>? headers, [ | ||||
|     Object? body, | ||||
|     Encoding? encoding, | ||||
|   ]) async { | ||||
|     final modifiedRequest = middleware.onRequest( | ||||
|       MiddlewareRequest( | ||||
|         unfreezedRequest: UnfreezedRequest( | ||||
|           method: method, | ||||
|           url: url, | ||||
|           headers: headers, | ||||
|           body: body, | ||||
|           encoding: encoding, | ||||
|         ), | ||||
|         httpRequest: Request(method, url), | ||||
|       ), | ||||
|     ); | ||||
| 
 | ||||
|     final res = await Response.fromStream( | ||||
|       await send(modifiedRequest.httpRequest), | ||||
|     ); | ||||
|     final response = | ||||
|         middleware.onResponse(MiddlewareResponse(httpResponse: res)); | ||||
| 
 | ||||
|     return response.httpResponse as Response; | ||||
|   } | ||||
| } | ||||
| @ -0,0 +1,52 @@ | ||||
| // Copyright (C) 2022 WYATT GROUP | ||||
| // Please see the AUTHORS file for details. | ||||
| // | ||||
| // This program is free software: you can redistribute it and/or modify | ||||
| // it under the terms of the GNU General Public License as published by | ||||
| // the Free Software Foundation, either version 3 of the License, or | ||||
| // any later version. | ||||
| // | ||||
| // This program is distributed in the hope that it will be useful, | ||||
| // but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||||
| // GNU General Public License for more details. | ||||
| // | ||||
| // You should have received a copy of the GNU General Public License | ||||
| // along with this program. If not, see <https://www.gnu.org/licenses/>. | ||||
| 
 | ||||
| import 'dart:convert'; | ||||
| 
 | ||||
| import 'package:wyatt_http_client/src/middleware.dart'; | ||||
| import 'package:wyatt_http_client/src/models/middleware_request.dart'; | ||||
| 
 | ||||
| class BodyToJsonMiddleware extends Middleware { | ||||
|   BodyToJsonMiddleware({ | ||||
|     super.child, | ||||
|   }); | ||||
| 
 | ||||
|   @override | ||||
|   String getName() => 'BodyToJsonMiddleware'; | ||||
| 
 | ||||
|   @override | ||||
|   MiddlewareRequest onRequest(MiddlewareRequest request) { | ||||
|     print( | ||||
|       'BodyToJson::OnRequest: transforms body in json if Map then update ' | ||||
|       'headers with right content-type', | ||||
|     ); | ||||
|     var newReq = request.unfreezedRequest; | ||||
|     final mutation = { | ||||
|       'content-type': 'application/json; charset=utf-8', | ||||
|     }; | ||||
|     if (newReq.body is Map) { | ||||
|       Map<String, String>? headers = newReq.headers; | ||||
|       if (headers != null) { | ||||
|         headers.addAll(mutation); | ||||
|       } else { | ||||
|         headers = mutation; | ||||
|       } | ||||
|       newReq = newReq.copyWith(body: jsonEncode(newReq.body), headers: headers); | ||||
|       request.updateUnfreezedRequest(newReq); | ||||
|     } | ||||
|     return super.onRequest(request); | ||||
|   } | ||||
| } | ||||
| @ -0,0 +1,26 @@ | ||||
| // Copyright (C) 2022 WYATT GROUP | ||||
| // Please see the AUTHORS file for details. | ||||
| // | ||||
| // This program is free software: you can redistribute it and/or modify | ||||
| // it under the terms of the GNU General Public License as published by | ||||
| // the Free Software Foundation, either version 3 of the License, or | ||||
| // any later version. | ||||
| // | ||||
| // This program is distributed in the hope that it will be useful, | ||||
| // but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||||
| // GNU General Public License for more details. | ||||
| // | ||||
| // You should have received a copy of the GNU General Public License | ||||
| // along with this program. If not, see <https://www.gnu.org/licenses/>. | ||||
| 
 | ||||
| import 'package:wyatt_http_client/src/middleware.dart'; | ||||
| 
 | ||||
| class DefaultMiddleware extends Middleware { | ||||
|   DefaultMiddleware({ | ||||
|     super.child, | ||||
|   }); | ||||
| 
 | ||||
|   @override | ||||
|   String getName() => 'DefaultMiddleware'; | ||||
| } | ||||
| @ -0,0 +1,72 @@ | ||||
| // Copyright (C) 2022 WYATT GROUP | ||||
| // Please see the AUTHORS file for details. | ||||
| // | ||||
| // This program is free software: you can redistribute it and/or modify | ||||
| // it under the terms of the GNU General Public License as published by | ||||
| // the Free Software Foundation, either version 3 of the License, or | ||||
| // any later version. | ||||
| // | ||||
| // This program is distributed in the hope that it will be useful, | ||||
| // but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||||
| // GNU General Public License for more details. | ||||
| // | ||||
| // You should have received a copy of the GNU General Public License | ||||
| // along with this program. If not, see <https://www.gnu.org/licenses/>. | ||||
| 
 | ||||
| import 'package:wyatt_http_client/src/middleware.dart'; | ||||
| import 'package:wyatt_http_client/src/middleware_client.dart'; | ||||
| import 'package:wyatt_http_client/src/middlewares/default_middleware.dart'; | ||||
| import 'package:wyatt_http_client/src/models/middleware_request.dart'; | ||||
| import 'package:wyatt_http_client/src/pipeline.dart'; | ||||
| 
 | ||||
| class RefreshTokenMiddleware extends Middleware { | ||||
|   final String authorizationEndpoint; | ||||
|   final String tokenEndpoint; | ||||
| 
 | ||||
|   String? accessToken; | ||||
|   String? refreshToken; | ||||
| 
 | ||||
|   Middleware innerClientMiddlewares; | ||||
| 
 | ||||
|   RefreshTokenMiddleware({ | ||||
|     required this.authorizationEndpoint, | ||||
|     required this.tokenEndpoint, | ||||
|     Middleware? innerClientMiddlewares, | ||||
|     super.child, | ||||
|   }) : innerClientMiddlewares = innerClientMiddlewares ?? DefaultMiddleware(); | ||||
| 
 | ||||
|   @override | ||||
|   String getName() => 'RefreshTokenMiddleware'; | ||||
| 
 | ||||
|   @override | ||||
|   MiddlewareRequest onRequest(MiddlewareRequest request) { | ||||
|     print( | ||||
|       'RefreshToken::OnRequest: accessToken: $accessToken', | ||||
|     ); | ||||
|     if (accessToken == null) { | ||||
|       // Refresh token | ||||
|       final pipeline = Pipeline().addMiddleware(innerClientMiddlewares); | ||||
|       print(pipeline.getLogic()); | ||||
|       final client = MiddlewareClient( | ||||
|         pipeline, | ||||
|         inner: getClient(), | ||||
|       ); | ||||
|       final _ = client.post(Uri.parse(tokenEndpoint)); | ||||
|     } | ||||
|     var newReq = request.unfreezedRequest; | ||||
|     final mutation = { | ||||
|       'authorization': accessToken ?? '', | ||||
|     }; | ||||
|     Map<String, String>? headers = newReq.headers; | ||||
|     if (headers != null) { | ||||
|       headers.addAll(mutation); | ||||
|     } else { | ||||
|       headers = mutation; | ||||
|     } | ||||
|     newReq = newReq.copyWith(headers: headers); | ||||
|     request.updateUnfreezedRequest(newReq); | ||||
| 
 | ||||
|     return super.onRequest(request); | ||||
|   } | ||||
| } | ||||
| @ -0,0 +1,47 @@ | ||||
| // Copyright (C) 2022 WYATT GROUP | ||||
| // Please see the AUTHORS file for details. | ||||
| // | ||||
| // This program is free software: you can redistribute it and/or modify | ||||
| // it under the terms of the GNU General Public License as published by | ||||
| // the Free Software Foundation, either version 3 of the License, or | ||||
| // any later version. | ||||
| // | ||||
| // This program is distributed in the hope that it will be useful, | ||||
| // but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||||
| // GNU General Public License for more details. | ||||
| // | ||||
| // You should have received a copy of the GNU General Public License | ||||
| // along with this program. If not, see <https://www.gnu.org/licenses/>. | ||||
| 
 | ||||
| import 'package:wyatt_http_client/src/middleware.dart'; | ||||
| import 'package:wyatt_http_client/src/models/middleware_request.dart'; | ||||
| import 'package:wyatt_http_client/src/models/middleware_response.dart'; | ||||
| 
 | ||||
| class SimpleLoggerMiddleware extends Middleware { | ||||
|   SimpleLoggerMiddleware({ | ||||
|     super.child, | ||||
|   }); | ||||
| 
 | ||||
|   @override | ||||
|   String getName() => 'SimpleLoggerMiddleware'; | ||||
| 
 | ||||
|   @override | ||||
|   MiddlewareRequest onRequest(MiddlewareRequest request) { | ||||
|     print( | ||||
|       'Logger::OnRequest: ${request.httpRequest.method} ' | ||||
|       '${request.httpRequest.url}', | ||||
|     ); | ||||
|     return super.onRequest(request); | ||||
|   } | ||||
| 
 | ||||
|   @override | ||||
|   MiddlewareResponse onResponse(MiddlewareResponse response) { | ||||
|     final res = super.onResponse(response); | ||||
|     print( | ||||
|       'Logger::OnResponse: ${res.httpResponse.statusCode} -> ' | ||||
|       'received ${res.httpResponse.contentLength} bytes', | ||||
|     ); | ||||
|     return res; | ||||
|   } | ||||
| } | ||||
| @ -0,0 +1,42 @@ | ||||
| // Copyright (C) 2022 WYATT GROUP | ||||
| // Please see the AUTHORS file for details. | ||||
| // | ||||
| // This program is free software: you can redistribute it and/or modify | ||||
| // it under the terms of the GNU General Public License as published by | ||||
| // the Free Software Foundation, either version 3 of the License, or | ||||
| // any later version. | ||||
| // | ||||
| // This program is distributed in the hope that it will be useful, | ||||
| // but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||||
| // GNU General Public License for more details. | ||||
| // | ||||
| // You should have received a copy of the GNU General Public License | ||||
| // along with this program. If not, see <https://www.gnu.org/licenses/>. | ||||
| 
 | ||||
| import 'package:wyatt_http_client/src/middleware.dart'; | ||||
| import 'package:wyatt_http_client/src/models/middleware_request.dart'; | ||||
| import 'package:wyatt_http_client/src/utils/protocols.dart'; | ||||
| 
 | ||||
| class UriPrefixMiddleware extends Middleware { | ||||
|   final Protocols protocol; | ||||
|   final String? authority; | ||||
| 
 | ||||
|   UriPrefixMiddleware({ | ||||
|     required this.protocol, | ||||
|     required this.authority, | ||||
|     super.child, | ||||
|   }); | ||||
| 
 | ||||
|   @override | ||||
|   String getName() => 'UriPrefixMiddleware'; | ||||
| 
 | ||||
|   @override | ||||
|   MiddlewareRequest onRequest(MiddlewareRequest request) { | ||||
|     final Uri uri = | ||||
|         Uri.parse('${protocol.scheme}$authority${request.httpRequest.url}'); | ||||
|     print('UriPrefix::OnRequest: ${request.httpRequest.url} -> $uri'); | ||||
|     request.updateHttpRequest(url: uri); | ||||
|     return super.onRequest(request); | ||||
|   } | ||||
| } | ||||
| @ -0,0 +1,89 @@ | ||||
| // ignore_for_file: public_member_api_docs, sort_constructors_first | ||||
| // Copyright (C) 2022 WYATT GROUP | ||||
| // Please see the AUTHORS file for details. | ||||
| // | ||||
| // This program is free software: you can redistribute it and/or modify | ||||
| // it under the terms of the GNU General Public License as published by | ||||
| // the Free Software Foundation, either version 3 of the License, or | ||||
| // any later version. | ||||
| // | ||||
| // This program is distributed in the hope that it will be useful, | ||||
| // but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||||
| // GNU General Public License for more details. | ||||
| // | ||||
| // You should have received a copy of the GNU General Public License | ||||
| // along with this program. If not, see <https://www.gnu.org/licenses/>. | ||||
| 
 | ||||
| import 'package:http/http.dart'; | ||||
| import 'package:wyatt_http_client/src/models/unfreezed_request.dart'; | ||||
| import 'package:wyatt_http_client/src/utils/utils.dart'; | ||||
| 
 | ||||
| class MiddlewareRequest { | ||||
|   UnfreezedRequest unfreezedRequest; | ||||
|   Request httpRequest; | ||||
| 
 | ||||
|   MiddlewareRequest({ | ||||
|     required this.unfreezedRequest, | ||||
|     required this.httpRequest, | ||||
|   }); | ||||
| 
 | ||||
|   MiddlewareRequest copyWith({ | ||||
|     UnfreezedRequest? unfreezedRequest, | ||||
|     Request? httpRequest, | ||||
|   }) { | ||||
|     return MiddlewareRequest( | ||||
|       unfreezedRequest: unfreezedRequest ?? this.unfreezedRequest, | ||||
|       httpRequest: httpRequest ?? this.httpRequest, | ||||
|     ); | ||||
|   } | ||||
| 
 | ||||
|   void updateUnfreezedRequest(UnfreezedRequest unfreezedRequest) { | ||||
|     final request = httpRequest; | ||||
|     if (unfreezedRequest.headers != null) { | ||||
|       request.headers.addAll(unfreezedRequest.headers!); | ||||
|     } | ||||
|     if (unfreezedRequest.encoding != null) { | ||||
|       request.encoding = unfreezedRequest.encoding!; | ||||
|     } | ||||
|     if (unfreezedRequest.body != null) { | ||||
|       final body = unfreezedRequest.body; | ||||
|       if (body is String) { | ||||
|         request.body = body; | ||||
|       } else if (body is List) { | ||||
|         request.bodyBytes = body.cast<int>(); | ||||
|       } else if (body is Map) { | ||||
|         request.bodyFields = body.cast<String, String>(); | ||||
|       } else { | ||||
|         throw ArgumentError('Invalid request body "$body".'); | ||||
|       } | ||||
|     } | ||||
|     this.unfreezedRequest = unfreezedRequest; | ||||
|     httpRequest = request; | ||||
|   } | ||||
| 
 | ||||
|   void updateHttpRequest({ | ||||
|     String? method, | ||||
|     Uri? url, | ||||
|     Map<String, String>? headers, | ||||
|     int? maxRedirects, | ||||
|     bool? followRedirects, | ||||
|     bool? persistentConnection, | ||||
|     String? body, | ||||
|   }) { | ||||
|     httpRequest = Utils.copyRequestWith( | ||||
|       httpRequest, | ||||
|       method: method, | ||||
|       url: url, | ||||
|       headers: headers, | ||||
|       maxRedirects: maxRedirects, | ||||
|       followRedirects: followRedirects, | ||||
|       persistentConnection: persistentConnection, | ||||
|       body: body, | ||||
|     ) as Request; | ||||
|   } | ||||
| 
 | ||||
|   @override | ||||
|   String toString() => 'MiddlewareRequest(unfreezedRequest: ' | ||||
|       '$unfreezedRequest, httpRequest: $httpRequest)'; | ||||
| } | ||||
| @ -0,0 +1,37 @@ | ||||
| // ignore_for_file: public_member_api_docs, sort_constructors_first | ||||
| // Copyright (C) 2022 WYATT GROUP | ||||
| // Please see the AUTHORS file for details. | ||||
| // | ||||
| // This program is free software: you can redistribute it and/or modify | ||||
| // it under the terms of the GNU General Public License as published by | ||||
| // the Free Software Foundation, either version 3 of the License, or | ||||
| // any later version. | ||||
| // | ||||
| // This program is distributed in the hope that it will be useful, | ||||
| // but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||||
| // GNU General Public License for more details. | ||||
| // | ||||
| // You should have received a copy of the GNU General Public License | ||||
| // along with this program. If not, see <https://www.gnu.org/licenses/>. | ||||
| 
 | ||||
| import 'package:http/http.dart'; | ||||
| 
 | ||||
| class MiddlewareResponse { | ||||
|   BaseResponse httpResponse; | ||||
|    | ||||
|   MiddlewareResponse({ | ||||
|     required this.httpResponse, | ||||
|   }); | ||||
| 
 | ||||
|   MiddlewareResponse copyWith({ | ||||
|     BaseResponse? httpResponse, | ||||
|   }) { | ||||
|     return MiddlewareResponse( | ||||
|       httpResponse: httpResponse ?? this.httpResponse, | ||||
|     ); | ||||
|   } | ||||
| 
 | ||||
|   @override | ||||
|   String toString() => 'MiddlewareResponse(httpResponse: $httpResponse)'; | ||||
| } | ||||
| @ -0,0 +1,55 @@ | ||||
| // Copyright (C) 2022 WYATT GROUP | ||||
| // Please see the AUTHORS file for details. | ||||
| // | ||||
| // This program is free software: you can redistribute it and/or modify | ||||
| // it under the terms of the GNU General Public License as published by | ||||
| // the Free Software Foundation, either version 3 of the License, or | ||||
| // any later version. | ||||
| // | ||||
| // This program is distributed in the hope that it will be useful, | ||||
| // but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||||
| // GNU General Public License for more details. | ||||
| // | ||||
| // You should have received a copy of the GNU General Public License | ||||
| // along with this program. If not, see <https://www.gnu.org/licenses/>. | ||||
| 
 | ||||
| import 'dart:convert'; | ||||
| 
 | ||||
| class UnfreezedRequest { | ||||
|   final String method; | ||||
|   final Uri url; | ||||
|   final Map<String, String>? headers; | ||||
|   final Object? body; | ||||
|   final Encoding? encoding; | ||||
| 
 | ||||
|   UnfreezedRequest({ | ||||
|     required this.method, | ||||
|     required this.url, | ||||
|     this.headers, | ||||
|     this.body, | ||||
|     this.encoding, | ||||
|   }); | ||||
| 
 | ||||
|   UnfreezedRequest copyWith({ | ||||
|     String? method, | ||||
|     Uri? url, | ||||
|     Map<String, String>? headers, | ||||
|     Object? body, | ||||
|     Encoding? encoding, | ||||
|   }) { | ||||
|     return UnfreezedRequest( | ||||
|       method: method ?? this.method, | ||||
|       url: url ?? this.url, | ||||
|       headers: headers ?? this.headers, | ||||
|       body: body ?? this.body, | ||||
|       encoding: encoding ?? this.encoding, | ||||
|     ); | ||||
|   } | ||||
| 
 | ||||
|   @override | ||||
|   String toString() { | ||||
|     return 'UnfreezedRequest(method: $method, url: $url, headers: ' | ||||
|         '$headers, body: $body, encoding: $encoding)'; | ||||
|   } | ||||
| } | ||||
							
								
								
									
										57
									
								
								packages/wyatt_http_client/lib/src/pipeline.dart
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										57
									
								
								packages/wyatt_http_client/lib/src/pipeline.dart
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,57 @@ | ||||
| // Copyright (C) 2022 WYATT GROUP | ||||
| // Please see the AUTHORS file for details. | ||||
| // | ||||
| // This program is free software: you can redistribute it and/or modify | ||||
| // it under the terms of the GNU General Public License as published by | ||||
| // the Free Software Foundation, either version 3 of the License, or | ||||
| // any later version. | ||||
| // | ||||
| // This program is distributed in the hope that it will be useful, | ||||
| // but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||||
| // GNU General Public License for more details. | ||||
| // | ||||
| // You should have received a copy of the GNU General Public License | ||||
| // along with this program. If not, see <https://www.gnu.org/licenses/>. | ||||
| 
 | ||||
| import 'package:wyatt_http_client/src/middleware.dart'; | ||||
| import 'package:wyatt_http_client/src/middlewares/default_middleware.dart'; | ||||
| 
 | ||||
| class Pipeline { | ||||
|   final Middleware _middleware; | ||||
| 
 | ||||
|   Pipeline() : _middleware = DefaultMiddleware(); | ||||
| 
 | ||||
|   Pipeline addMiddleware(Middleware middleware) { | ||||
|     _middleware.addChild(middleware); | ||||
|     return this; | ||||
|   } | ||||
| 
 | ||||
|   Middleware get middleware { | ||||
|     return _middleware; | ||||
|   } | ||||
| 
 | ||||
|   Pipeline operator +(Pipeline other) { | ||||
|     final copy = _middleware.deepCopy()..addChild(other.middleware); | ||||
|     return Pipeline()..addMiddleware(copy); | ||||
|   } | ||||
| 
 | ||||
|   String getLogic() { | ||||
|     final req = <String>[]; | ||||
|     final res = <String>[]; | ||||
|     Middleware? m = _middleware; | ||||
|     while (m != null) { | ||||
|       if (m is! DefaultMiddleware) { | ||||
|         req.add('$m'); | ||||
|         res.insert(0, '$m'); | ||||
|       } | ||||
|       m = m.child; | ||||
|     } | ||||
|     return '[Req] -> ${req.join(' -> ')}\n[Res] -> ${res.join(' -> ')}'; | ||||
|   } | ||||
| 
 | ||||
|   @override | ||||
|   String toString() { | ||||
|     return middleware.toString(); | ||||
|   } | ||||
| } | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user