Viewing version 2.1.7. Open the latest package page.

dio

2.1.7

A powerful Http client for Dart, which supports Interceptors, FormData, Request Cancellation, File Downloading, Timeout etc.

Download archive

Readme

Language: English | 中文简体

dio

build status Pub support

A powerful Http client for Dart, which supports Interceptors, Global configuration, FormData, Request Cancellation, File downloading, Timeout etc.

Add dependency

dependencies:
  dio: 2.1.x  #latest version

If you are using 1.0.x , this doc can help you upgrade to 2.0.x. Change log

Super simple to use

import 'package:dio/dio.dart';
void getHttp() async {
  try {
    Response response = await Dio().get("http://www.google.com");
    print(response);
  } catch (e) {
    print(e);
  }
}

Table of contents

Examples

Performing a GET request:

Response response;
Dio dio = new Dio();
response = await dio.get("/test?id=12&name=wendu")
print(response.data.toString());
// Optionally the request above could also be done as
response = await dio.get("/test", queryParameters: {"id": 12, "name": "wendu"});
print(response.data.toString());

Performing a POST request:

response = await dio.post("/test", data: {"id": 12, "name": "wendu"});

Performing multiple concurrent requests:

response = await Future.wait([dio.post("/info"), dio.get("/token")]);

Downloading a file:

response = await dio.download("https://www.google.com/", "./xx.html");

Get response stream:

Response<ResponseBody> rs = await Dio().get<ResponseBody>(url,
 options: Options(responseType: ResponseType.stream), // set responseType to `stream`
);
print(rs.data.stream); //response stream

Get response with bytes:

Response<List<int>> rs = await Dio().get<List<int>>(url,
 options: Options(responseType: ResponseType.bytes), // // set responseType to `bytes`
);
print(rs.data); // List<int>

Sending FormData:

FormData formData = new FormData.from({
    "name": "wendux",
    "age": 25,
  });
response = await dio.post("/info", data: formData);

Uploading multiple files to server by FormData:

FormData formData = new FormData.from({
    "name": "wendux",
    "age": 25,
    "file1": new UploadFileInfo(new File("./upload.txt"), "upload1.txt"),
    // upload with bytes (List<int>)
    "file2": new UploadFileInfo.fromBytes(
        utf8.encode("hello world"), "word.txt"),
    // Pass multiple files within an Array
    "files": [
      new UploadFileInfo(new File("./example/upload.txt"), "upload.txt"),
      new UploadFileInfo(new File("./example/upload.txt"), "upload.txt")
    ]
});

Listening the uploading progress:

response = await dio.post(
  "http://www.dtworkroom.com/doris/1/2.0.0/test",
  data: {"aa": "bb" * 22},
  onSendProgress: (int sent, int total) {
    print("$sent $total");
  },
);

Post binary data by Stream:

// Binary data
List<int> postData = <int>[...];
await dio.post(
  url,
  data: Stream.fromIterable(postData.map((e) => [e])), //create a Stream<List<int>>
  options: Options(
    headers: {
      HttpHeaders.contentLengthHeader: postData.length, // set content-length
    },
  ),
);

…you can find all examples code here.

Dio APIs

Creating an instance and set default configs.

You can create instance of Dio with an optional BaseOptions object:

Dio dio = new Dio(); // with default Options

// Set default configs
dio.options.baseUrl = "https://www.xx.com/api";
dio.options.connectTimeout = 5000; //5s
dio.options.receiveTimeout = 3000;

// or new Dio with a Options instance.
Options options = new BaseOptions(
    baseUrl: "https://www.xx.com/api",
    connectTimeout: 5000,
    receiveTimeout: 3000,
);
Dio dio = new Dio(options);

The core API in Dio instance is:

Future request(String path, {data,Map queryParameters, Options options,CancelToken cancelToken, ProgressCallback onSendProgress, ProgressCallback onReceiveProgress)

response=await request(
    "/test",
    data: {"id":12,"name":"xx"}, 
    options: Options(method:"GET"),
);

Request method aliases

For convenience aliases have been provided for all supported request methods.

Future get(...)

Future post(...)

Future put(...)

Future delete(...)

Future head(...)

Future put(...)

Future path(...)

Future download(...)

Request Options

The Options class describes the http request information and configuration. Each Dio instance has a base config for all requests maked by itself, and we can override the base config with [Options] when make a single request. The [BaseOptions] declaration as follows:

{
  /// Http method.
  String method;

  /// Request base url, it can contain sub path, like: "https://www.google.com/api/".
  String baseUrl;

  /// Http request headers.
  Map<String, dynamic> headers;

   /// Timeout in milliseconds for opening  url.
  int connectTimeout;

   ///  Whenever more than [receiveTimeout] (in milliseconds) passes between two events from response stream,
  ///  [Dio] will throw the [DioError] with [DioErrorType.RECEIVE_TIMEOUT].
  ///  Note: This is not the receiving time limitation.
  int receiveTimeout;

  /// Request data, can be any type.
  T data;

  /// If the `path` starts with "http(s)", the `baseURL` will be ignored, otherwise,
  /// it will be combined and then resolved with the baseUrl.
  String path="";

  /// The request Content-Type. The default value is [ContentType.JSON].
  /// If you want to encode request body with "application/x-www-form-urlencoded",
  /// you can set `ContentType.parse("application/x-www-form-urlencoded")`, and [Dio]
  /// will automatically encode the request body.
  ContentType contentType;

  /// [responseType] indicates the type of data that the server will respond with
  /// options which defined in [ResponseType] are `JSON`, `STREAM`, `PLAIN`.
  ///
  /// The default value is `JSON`, dio will parse response string to json object automatically
  /// when the content-type of response is "application/json".
  ///
  /// If you want to receive response data with binary bytes, for example,
  /// downloading a image, use `STREAM`.
  ///
  /// If you want to receive the response data with String, use `PLAIN`.
  ResponseType responseType;
  
  /// `validateStatus` defines whether the request is successful for a given
  /// HTTP response status code. If `validateStatus` returns `true` ,
  /// the request will be perceived as successful; otherwise, considered as failed.
  ValidateStatus validateStatus;

  /// Custom field that you can retrieve it later in [Interceptor]、[Transformer] and the   [Response] object.
  Map<String, dynamic> extra;
  
  /// Custom Cookies
  Iterable<Cookie> cookies;
}

There is a complete example here.

Response Schema

The response for a request contains the following information.

{
  /// Response body. may have been transformed, please refer to [ResponseType].
  T data;
  /// Response headers.
  HttpHeaders headers;
  /// The corresponding request info.
  Options request;
  /// Http status code.
  int statusCode;
  /// Custom field that you can retrieve it later in `then`.
  Map<String, dynamic> extra;
}

When request is succeed, you will receive the response as follows:

Response response = await dio.get("https://www.google.com");
print(response.data);
print(response.headers);
print(response.request);
print(response.statusCode);

Interceptors

For each dio instance, We can add one or more interceptors, by which we can intercept requests or responses before they are handled by then or catchError.

dio.interceptors.add(InterceptorsWrapper(
    onRequest:(RequestOptions options){
     // Do something before request is sent
     return options; //continue
     // If you want to resolve the request with some custom data,
     // you can return a `Response` object or return `dio.resolve(data)`.
     // If you want to reject the request with a error message, 
     // you can return a `DioError` object or return `dio.reject(errMsg)`    
    },
    onResponse:(Response response) {
     // Do something with response data
     return response; // continue
    },
    onError: (DioError e) {
     // Do something with response error
     return  e;//continue
    }
));

Resolve and reject the request

In all interceptors, you can interfere with their execution flow. If you want to resolve the request/response with some custom data,you can return a Response object or return dio.resolve(data). If you want to reject the request/response with a error message, you can return a DioError object or return dio.reject(errMsg) .

dio.interceptors.add(InterceptorsWrapper(
  onRequest:(RequestOptions options){
   return dio.resolve("fake data")    
  },
));
Response response = await dio.get("/test");
print(response.data);//"fake data"

Supports Async tasks in Interceptors

Interceptors not only support synchronous tasks, but also supports asynchronous tasks, for example:

dio.interceptors.add(InterceptorsWrapper(
    onRequest:(Options options) async{
        //...If no token, request token firstly.
        Response response = await dio.get("/token");
        //Set the token to headers 
        options.headers["token"] = response.data["data"]["token"];
        return options; //continue   
    }
));

Lock/unlock the interceptors

You can lock/unlock the interceptors by calling their lock()/unlock method. Once the request/response interceptor is locked, the incoming request/response will be added to a queue before they enter the interceptor, they will not be continued until the interceptor is unlocked.

tokenDio = new Dio(); //Create a new instance to request the token.
tokenDio.options = dio;
dio.interceptors.add(InterceptorsWrapper(
    onRequest:(Options options) async {
        // If no token, request token firstly and lock this interceptor
        // to prevent other request enter this interceptor.
        dio.interceptors.requestLock.lock();
        // We use a new Dio(to avoid dead lock) instance to request token.
        Response response = await tokenDio.get("/token");
        //Set the token to headers
        options.headers["token"] = response.data["data"]["token"];
        dio.interceptors.requestLock.unlock();
        return options; //continue
    }
));

You can clean the waiting queue by calling clear();

aliases

When the request interceptor is locked, the incoming request will pause, this is equivalent to we locked the current dio instance, Therefore, Dio provied the two aliases for the lock/unlock of request interceptors.

dio.lock() == dio.interceptors.requestLock.lock()

dio.unlock() == dio.interceptors.requestLock.unlock()

dio.clear() == dio.interceptors.requestLock.clear()

Example

Because of security reasons, we need all the requests to set up a csrfToken in the header, if csrfToken does not exist, we need to request a csrfToken first, and then perform the network request, because the request csrfToken progress is asynchronous, so we need to execute this async request in request interceptor. The code is as follows:

dio.interceptors.add(InterceptorsWrapper(
    onRequest: (Options options) {
        print('send request:path:${options.path},baseURL:${options.baseUrl}');
        if (csrfToken == null) {
            print("no token,request token firstly...");
            //lock the dio.
            dio.lock();
            return tokenDio.get("/token").then((d) {
                options.headers["csrfToken"] = csrfToken = d.data['data']['token'];
                print("request token succeed, value: " + d.data['data']['token']);
                print(
                    'continue to perform request:path:${options.path},baseURL:${options.path}');
                return options;
            }).whenComplete(() => dio.unlock()); // unlock the dio
        } else {
            options.headers["csrfToken"] = csrfToken;
            return options;
        }
    }
));

For complete codes click here.

Log

You can set LogInterceptor to print request/response log automaticlly, for example:

dio.interceptors.add(LogInterceptor(responseBody: false)); //开启请求日志

Cookie Manager

CookieManager Interceptor can help us manage the request/response cookies automaticly. CookieManager depends on cookieJar package :

The dio cookie manage API is based on the withdrawn cookie_jar.

You can create a CookieJar or PersistCookieJar to manage cookies automatically, and dio use the CookieJar by default, which saves the cookies in RAM. If you want to persists cookies, you can use the PersistCookieJar class, the example codes as follows:

var dio = new Dio();
dio.interceptors.add(CookieManager(CookieJar()))

PersistCookieJar is a cookie manager which implements the standard cookie policy declared in RFC. PersistCookieJar persists the cookies in files, so if the application exit, the cookies always exist unless call delete explicitly.

Note: In flutter, the path passed to PersistCookieJar must be valid(exists in phones and with write access). you can use path_provider package to get right path

More details about cookie_jar see : https://github.com/flutterchina/cookie_jar .

Custom Interceptor

You can custom interceptor by extending the Interceptor class. There is an example that implementing a simple cache policy: custom cache interceptor.

Handling Errors

When a error occurs, Dio will wrap the Error/Exception to a DioError:

try {
    //404  
    await dio.get("https://wendux.github.io/xsddddd");
} on DioError catch(e) {
    // The request was made and the server responded with a status code
    // that falls out of the range of 2xx and is also not 304.
    if(e.response) {
        print(e.response.data) 
        print(e.response.headers) 
        print(e.response.request)    
    } else{
        // Something happened in setting up or sending the request that triggered an Error  
        print(e.request)  
        print(e.message)
    }  
}

DioError scheme

 {
  /// Response info, it may be `null` if the request can't reach to
  /// the http server, for example, occurring a dns error, network is not available.
  Response response;

  /// Error descriptions.
  String message;
  
  DioErrorType type;
  
  /// The original error/exception object; It's usually not null when `type` 
  /// is DioErrorType.DEFAULT
  dynamic error;

  /// Error stacktrace info
  StackTrace stackTrace;
}

DioErrorType

enum DioErrorType {
  /// When opening  url timeout, it occurs.
  CONNECT_TIMEOUT,

  ///It occurs when receiving timeout.
  RECEIVE_TIMEOUT,

  /// When the server response, but with a incorrect status, such as 404, 503...
  RESPONSE,

  /// When the request is cancelled, dio will throw a error with this type.
  CANCEL,

  /// Default error type, Some other Error. In this case, you can
  /// read the DioError.error if it is not null.
  DEFAULT,
}

Using application/x-www-form-urlencoded format

By default, Dio serializes request data(except String type) to JSON. To send data in the application/x-www-form-urlencoded format instead, you can :

//Instance level
dio.options.contentType=ContentType.parse("application/x-www-form-urlencoded");
//or works once
dio.post("/info",data:{"id":5}, options: new Options(contentType:ContentType.parse("application/x-www-form-urlencoded")));

There is an example here.

Sending FormData

You can also send FormData with Dio, which will send data in the multipart/form-data, and it supports uploading files.

FormData formData = new FormData.from({
    "name": "wendux",
    "age": 25,
    "file": new UploadFileInfo(new File("./example/upload.txt"), "upload.txt")
});
response = await dio.post("/info", data: formData);

Note: Just the post method suppots FormData.

There is a complete example here.

Transformer

Transformer allows changes to the request/response data before it is sent/received to/from the server. This is only applicable for request methods 'PUT', 'POST', and 'PATCH'. Dio has already implemented a DefaultTransformer, and as the default Transformer. If you want to customize the transformation of request/response data, you can provide a Transformer by your self, and replace the DefaultTransformer by setting the dio.transformer.

In flutter

If you use dio in flutter development, you'd better to decode json in background with [compute] function.

// Must be top-level function
_parseAndDecode(String response) {
  return jsonDecode(response);
}

parseJson(String text) {
  return compute(_parseAndDecode, text);
}

void main() {
  ...
  //Custom jsonDecodeCallback   
  (dio.transformer as DefaultTransformer).jsonDecodeCallback = parseJson;
  runApp(MyApp());
}

Other Example

There is an example for customizing Transformer.

HttpClientAdapter

HttpClientAdapter is a bridge between Dio and HttpClient.

Dio implements standard and friendly API for developer.

HttpClient: It is the real object that makes Http requests.

We can use any HttpClient not just dart:io:HttpClient to make the Http request. And all we need is providing a HttpClientAdapter. The default HttpClientAdapter for Dio is DefaultHttpClientAdapter.

dio.httpClientAdapter = new DefaultHttpClientAdapter();

Using proxy

DefaultHttpClientAdapter provide a callback to set proxy to dart:io:HttpClient, for example:

(dio.httpClientAdapter as DefaultHttpClientAdapter).onHttpClientCreate = (client) {
    // config the http client  
    client.findProxy = (uri) {
        //proxy all request to localhost:8888
        return "PROXY localhost:8888";
    };
    // you can also create a new HttpClient to dio
    // return new HttpClient();  
};

There is a complete example here.

Https certificate verification

There are two ways to verify the https certificate. Suppose the certificate format is PEM, the code like:

String PEM="XXXXX"; // certificate content 
(dio.httpClientAdapter as DefaultHttpClientAdapter).onHttpClientCreate  = (client) {
    client.badCertificateCallback=(X509Certificate cert, String host, int port){
        if(cert.pem==PEM){ // Verify the certificate
            return true; 
        }
        return false;
    };
};

Another way is creating a SecurityContext when create the HttpClient:

(dio.httpClientAdapter as DefaultHttpClientAdapter).onHttpClientCreate  = (client) {
    SecurityContext sc = new SecurityContext();
    //file is the path of certificate
    sc.setTrustedCertificates(file);
    HttpClient httpClient = new HttpClient(context: sc);
    return httpClient;
};

In this way, the format of certificate must be PEM or PKCS12.

Cancellation

You can cancel a request using a cancel token. One token can be shared with multiple requests. When a token's cancel method invoked, all requests with this token will be cancelled.

CancelToken token = new CancelToken();
dio.get(url1, cancelToken: token);
dio.get(url2, cancelToken: token);

// cancel the requests with "cancelled" message.
token.cancel("cancelled");

There is a complete example here.

Copyright & License

This open source project authorized by https://flutterchina.club , and the license is MIT.

Features and bugs

Please file feature requests and bugs at the issue tracker.

Donate

Buy a cup of coffee for me (Scan by wechat):

Changelog

2.1.7

  • fix #321 #318

2.1.6

2.1.5

2.1.4

  • Add options.responseDecoder
  • Make DioError catchable by implementing Exception instead of Error

2.1.3

Add statusMessage attribute for Response and ResponseBody

2.1.2

First Stable version for 2.x

2.0

Refactor the Interceptors

  • Support add Multiple Interceptors.
  • Add Log Interceptor
  • Add CookieManager Interceptor

API

  • Support Uri
  • Support queryParameters for all request API
  • Modify the get API

Options

  • Separate Options to three class: Options、BaseOptions、RequestOptions
  • Add queryParameters and cookies for BaseOptions

Adapter

  • Abstract HttpClientAdapter layer.
  • Provide a DefaultHttpClientAdapter which make http requests by dart:io:HttpClient

0.1.8

  • change file name "TransFormer" to "Transformer"
  • change "dio.transFormer" to "dio.transformer"
  • change deprecated "UTF8" to "utf8"

0.1.5

  • add clear method for dio instance

0.1.4

  • fix download bugs

0.1.3

  • support upload files with Array
  • support create HttpClient by user self in onHttpClientCreate
  • support generic
  • bug fix

0.0.1

  • Initial version, created by Stagehand

Installing

export PUB_HOSTED_URL=https://pub.mirror.p-hatan.ir
flutter pub add 'dio:2.1.7'
pubspec.yaml
name: dio
description: A powerful Http client for Dart, which supports Interceptors, FormData, Request Cancellation, File Downloading, Timeout etc.
version: 2.1.7
homepage: https://github.com/flutterchina/dio
author: wendux <824783146@qq.com>

environment:
  sdk: '>=1.9.0 <3.0.0'

dependencies:
  cookie_jar: ^1.0.0
#  cookie_jar:
#    path: ../cookie_jar

dev_dependencies:
  test: ^1.5.1
  test_coverage: ^0.2.0
  pedantic: '1.1.0'

Version history

VersionPublishedArchiveSHA-256
0.0.1Cached · Upstream SHA-256 matchedDownload5bc41fc8…eddd8b
0.0.2Cached · Upstream SHA-256 matchedDownload4cac0107…91fd69
0.0.3Cached · Upstream SHA-256 matchedDownload7ce1180b…b9fad8
0.0.4Cached · Upstream SHA-256 matchedDownloada12b23ee…e96eb7
0.0.5Cached · Upstream SHA-256 matchedDownload169d5b7f…062689
0.0.6Cached · Upstream SHA-256 matchedDownload9e74de0d…dafe09
0.0.7Cached · Upstream SHA-256 matchedDownload22e05669…d96dfa
0.0.8Cached · Upstream SHA-256 matchedDownload50abafcc…ae6d76
0.0.9Cached · Upstream SHA-256 matchedDownload5f6f9d5a…ef2fc2
0.0.10Cached · Upstream SHA-256 matchedDownloade59ebb5b…17b838
0.0.11Cached · Upstream SHA-256 matchedDownloadcbeab948…689e68
0.0.12Cached · Upstream SHA-256 matchedDownloadb485e914…de23cc
0.0.13Cached · Upstream SHA-256 matchedDownload123c5841…4317d6
0.0.14Cached · Upstream SHA-256 matchedDownload72cb0bbc…e21b15
0.1.1Cached · Upstream SHA-256 matchedDownload62ab575e…a97e58
0.1.2Cached · Upstream SHA-256 matchedDownloadbda27230…2a7105
0.1.3Cached · Upstream SHA-256 matchedDownloadae23824f…2022be
0.1.4Cached · Upstream SHA-256 matchedDownloadda995108…68e860
0.1.5Cached · Upstream SHA-256 matchedDownload82cc6e7e…44be8d
0.1.6Cached · Upstream SHA-256 matchedDownload0afe7b54…ca098b
0.1.7Cached · Upstream SHA-256 matchedDownload8ffea790…949274
0.1.8Cached · Upstream SHA-256 matchedDownload39f62ea9…f765a0
1.0.0Cached · Upstream SHA-256 matchedDownload4a1f41f7…3cdf27
1.0.1Cached · Upstream SHA-256 matchedDownload7cc5af51…87cc00
1.0.2Cached · Upstream SHA-256 matchedDownload7fecdca6…3db3e3
1.0.3Cached · Upstream SHA-256 matchedDownload0fddaf68…f1a2e3
1.0.4Cached · Upstream SHA-256 matchedDownloadec5b8a46…27563c
1.0.5Cached · Upstream SHA-256 matchedDownload2a8b2d04…e73a92
1.0.6Cached · Upstream SHA-256 matchedDownload3853004e…ce3644
1.0.7Cached · Upstream SHA-256 matchedDownloadc44cfae4…2f77aa
1.0.8Cached · Upstream SHA-256 matchedDownload795030f2…37d5ba
1.0.9Cached · Upstream SHA-256 matchedDownload30684a27…c5300b
1.0.10Cached · Upstream SHA-256 matchedDownload3915eca0…9a138e
1.0.11Cached · Upstream SHA-256 matchedDownload830d5c1e…264e31
1.0.12Cached · Upstream SHA-256 matchedDownload0f20e63a…6cb856
1.0.13Cached · Upstream SHA-256 matchedDownloadf2fb84fd…dca6a8
1.0.14Cached · Upstream SHA-256 matchedDownloada08bfb31…dcfcb4
1.0.15Cached · Upstream SHA-256 matchedDownload127dead5…56ac22
1.0.16Cached · Upstream SHA-256 matchedDownload31159699…00b06b
1.0.17Cached · Upstream SHA-256 matchedDownloadaf70e1e1…44568c
2.0.0Cached · Upstream SHA-256 matchedDownloadf43c90e8…a8efdb
2.0.1Cached · Upstream SHA-256 matchedDownloade3f4a06b…f48e30
2.0.2Cached · Upstream SHA-256 matchedDownloadb2494d87…14ba57
2.0.3Cached · Upstream SHA-256 matchedDownloade8b10c4a…3b7cf3
2.0.4Cached · Upstream SHA-256 matchedDownloadc5573672…1e12b2
2.0.5Cached · Upstream SHA-256 matchedDownload7a01aad5…61e2e5
2.0.6Cached · Upstream SHA-256 matchedDownload6ca3e0fa…b8aa07
2.0.7Cached · Upstream SHA-256 matchedDownload95e034ef…617a60
2.0.8Cached · Upstream SHA-256 matchedDownload64ce4aef…0fe1f2
2.0.9Cached · Upstream SHA-256 matchedDownloaddcf4d22e…b3a294
2.0.10Cached · Upstream SHA-256 matchedDownloade848ec5b…e00d23
2.0.11Cached · Upstream SHA-256 matchedDownloade10bc8ba…fb0869
2.0.12Cached · Upstream SHA-256 matchedDownloadb952b98b…e51cac
2.0.13Cached · Upstream SHA-256 matchedDownloadad0a5ec2…42703f
2.0.14Cached · Upstream SHA-256 matchedDownload760754bc…d9d185
2.0.15Cached · Upstream SHA-256 matchedDownload106febea…74f9bb
2.0.16Cached · Upstream SHA-256 matchedDownload78baa870…4febcb
2.0.17Cached · Upstream SHA-256 matchedDownloadfab3b27d…b34d3f
2.0.18Cached · Upstream SHA-256 matchedDownloadcf252dc1…66621f
2.0.19Cached · Upstream SHA-256 matchedDownloadba1241f6…174412
2.0.20Cached · Upstream SHA-256 matchedDownload05fd4795…2d75c7
2.0.21Cached · Upstream SHA-256 matchedDownload6ec20e7a…845103
2.0.22Cached · Upstream SHA-256 matchedDownload9516eecb…0d28e9
2.0.23Cached · Upstream SHA-256 matchedDownload4c44720a…2383c1
2.1.0Cached · Upstream SHA-256 matchedDownload5a162a32…6ebd7b
2.1.1Cached · Upstream SHA-256 matchedDownload0585f94d…a1ce01
2.1.2Cached · Upstream SHA-256 matchedDownload76692010…2064d0
2.1.3Cached · Upstream SHA-256 matchedDownload1283cfd5…57805b
2.1.4Cached · Upstream SHA-256 matchedDownload4057b7d2…26c96e
2.1.5Cached · Upstream SHA-256 matchedDownload4cb1357b…1c0b9e
2.1.6Cached · Upstream SHA-256 matchedDownload4593d2c3…3fb868
2.1.7Cached · Upstream SHA-256 matchedDownload0e127cea…61b481
2.1.8Cached · Upstream SHA-256 matchedDownload815503e6…1be1d9
2.1.9Cached · Upstream SHA-256 matchedDownload2566bd41…5f879e
2.1.10Cached · Upstream SHA-256 matchedDownload844d05b5…157743
2.1.11Cached · Upstream SHA-256 matchedDownload6107ab69…2a9e71
2.1.12Cached · Upstream SHA-256 matchedDownloadfcc9326b…a64142
2.1.13Cached · Upstream SHA-256 matchedDownloade242b7e1…7f13f3
2.1.14Cached · Upstream SHA-256 matchedDownload29fcb893…ed6463
2.1.15Cached · Upstream SHA-256 matchedDownload3438f224…2d1b37
2.1.16Cached · Upstream SHA-256 matchedDownload5fb66ffd…a4835d
2.2.0Cached · Upstream SHA-256 matchedDownloada7e5346e…4565bf
2.2.1Cached · Upstream SHA-256 matchedDownload479c30bd…ad427c
2.2.2Cached · Upstream SHA-256 matchedDownload8ac4d649…17fcb3
3.0.0-dev.1Cached · Upstream SHA-256 matchedDownload03ce7b80…4faac2
3.0.0Cached · Upstream SHA-256 matchedDownloadf2b8c907…9cfad2
3.0.1Cached · Upstream SHA-256 matchedDownload7c54b490…9b2208
3.0.2-dev.1Cached · Upstream SHA-256 matchedDownload35ac5f65…d4ae3f
3.0.2Cached · Upstream SHA-256 matchedDownloadd0576184…0d7635
3.0.3Cached · Upstream SHA-256 matchedDownloadd76e0f80…f219bc
3.0.4Cached · Upstream SHA-256 matchedDownloaddf5b4f12…579ad7
3.0.5Cached · Upstream SHA-256 matchedDownloadf77f0947…d69d7e
3.0.6Cached · Upstream SHA-256 matchedDownload9ca0e64d…9de525
3.0.7Cached · Upstream SHA-256 matchedDownloadd71f4317…e7d25c
3.0.8-dev.1Cached · Upstream SHA-256 matchedDownload1b028070…e4322b
3.0.8Cached · Upstream SHA-256 matchedDownload155a7f6f…99664b
3.0.9Cached · Upstream SHA-256 matchedDownload49c26d80…876d06
3.0.10Cached · Upstream SHA-256 matchedDownload11979099…bcdd27
4.0.0-beta1Cached · Upstream SHA-256 matchedDownloade05c44c4…5cb588
4.0.0-beta2Cached · Upstream SHA-256 matchedDownloadc650d085…e93e7c
4.0.0-beta3Cached · Upstream SHA-256 matchedDownload186f0697…d4634a
4.0.0-beta4Cached · Upstream SHA-256 matchedDownload25d55004…048065
4.0.0-beta5Cached · Upstream SHA-256 matchedDownload4f625ee7…2e6c0a
4.0.0-beta6Cached · Upstream SHA-256 matchedDownloadabcc1d1d…b04235
4.0.0-beta7Cached · Upstream SHA-256 matchedDownload14c118b5…9d8eb5
4.0.0-prev1Cached · Upstream SHA-256 matchedDownload1b5e25c8…ff684f
4.0.0-prev2Cached · Upstream SHA-256 matchedDownloadb4f0f86a…bc773b
4.0.0-prev3Cached · Upstream SHA-256 matchedDownload0ee6bffb…a82e89
4.0.0Cached · Upstream SHA-256 matchedDownloadbf173c8b…612947
4.0.1Cached · Upstream SHA-256 matchedDownload826fe225…44a60f
4.0.2-beta1Cached · Upstream SHA-256 matchedDownloadec4c0dd1…821c6b
4.0.2Cached · Upstream SHA-256 matchedDownload5c290dbf…77057f
4.0.3Cached · Upstream SHA-256 matchedDownload06fc445e…bb0a9e
4.0.4Cached · Upstream SHA-256 matchedDownload5fd6e152…fd7b1c
4.0.5-beta1Cached · Upstream SHA-256 matchedDownload605f4b72…3f5aa5
4.0.5Cached · Upstream SHA-256 matchedDownloaddad4ffe0…6a996a
4.0.6Cached · Upstream SHA-256 matchedDownload7d328c4d…75e2e8
5.0.0Cached · Upstream SHA-256 matchedDownload9fdbf71b…67d316
5.0.1Cached · Upstream SHA-256 matchedDownload3709d746…e6287e
5.0.2Cached · Upstream SHA-256 matchedDownload2644a9e0…070d7b
5.0.3Cached · Upstream SHA-256 matchedDownload3e5c4a94…32100b
5.1.0Cached · Upstream SHA-256 matchedDownloadf7c26ddb…f8bfce
5.1.1Cached · Upstream SHA-256 matchedDownload0894a098…0f11e9
5.1.2Cached · Upstream SHA-256 matchedDownload347d56c2…e05059
5.2.0Cached · Upstream SHA-256 matchedDownloade44ce32c…c62e6d
5.2.0+1Cached · Upstream SHA-256 matchedDownloadb99b1d56…81bdf2
5.2.1Cached · Upstream SHA-256 matchedDownloaddfda195c…711d1e
5.2.1+1Cached · Upstream SHA-256 matchedDownloada9d76e72…6752b8
5.3.0Cached · Upstream SHA-256 matchedDownload3866d67f…b49993
5.3.1Cached · Upstream SHA-256 matchedDownload9d6445da…cbdd2f
5.3.2Cached · Upstream SHA-256 matchedDownloadce75a1b4…bc4197
5.3.3Cached · Upstream SHA-256 matchedDownload417e2a6f…0140b7
5.3.4Cached · Upstream SHA-256 matchedDownload01870acd…dfea4c
5.4.0Cached · Upstream SHA-256 matchedDownload797e1e34…1645c3
5.4.1Cached · Upstream SHA-256 matchedDownload49af2838…6ce5a8
5.4.2Cached · Upstream SHA-256 matchedDownload50fec961…abeca9
5.4.2+1Cached · Upstream SHA-256 matchedDownload0978e9a3…70217f
5.4.3Cached · Upstream SHA-256 matchedDownload639179e1…834801
5.4.3+1Cached · Upstream SHA-256 matchedDownload11e40df5…9034b5
5.5.0Cached · Upstream SHA-256 matchedDownload77befddd…0de0c8
5.5.0+1Cached · Upstream SHA-256 matchedDownloade17f6b30…e73714
5.6.0Cached · Upstream SHA-256 matchedDownload0dfb6b6a…715fb0
5.7.0Cached · Upstream SHA-256 matchedDownload5598aa79…efc260
5.8.0Cached · Upstream SHA-256 matchedDownload5fe8c827…c8d5b0
5.8.0+1Cached · Upstream SHA-256 matchedDownload253a18bb…c8dbc9
5.9.0Cached · Upstream SHA-256 matchedDownloadd90ee579…ac66a9
5.9.1Cached · Upstream SHA-256 matchedDownloadb9d46fae…e57b25
5.9.2Cached · Upstream SHA-256 matchedDownloadaff32c08…e64f8c
5.10.0Cached · Upstream SHA-256 matchedDownloadea2bad3c…0922b0
5.11.0Cached · Upstream SHA-256 matchedDownload0df44ebb…abbb3c
5.11.1Cached · Upstream SHA-256 matchedDownload852ec3b4…4192c1

Dependencies

cookie_jar "^1.0.0"