Repository: CS-SI/eodag
Pull request #1266 (2024-07-18 13:07:10)

fix(plugins): http asset HEAD check and ssl_verify
Fixes `HTTPDownload` HEAD requests check when downloading single asset, and adds the possibility to disable its SSL verification

github-actions[bot]: ## Test Results
    4 files  ±0      4 suites  ±0   6m 7s :stopwatch: +2s
  552 tests ±0    549 :white_check_mark: ±0    3 :zzz: ±0  0 :x: ±0 
2 208 runs  ±0  2 106 :white_check_mark: ±0  102 :zzz: ±0  0 :x: ±0 

Results for commit 0550b54d. ± Comparison against base commit 7f1b989f.

[test-results]:data:application/gzip;base64,H4sIAHgUmWYC/03MTQ7CIBCG4as0rF0MI0PByxgEmhD7YyisGu8uaItdvs9kvo0NYfQru3Xi0rE1h9TC5WhSWOaSV9kXKKdUj0R41H3N1lYS+k/P8Ko/DQYTxgLQwMe4xF1inusmIqi9jk3kIBv9NjngIafRb5837TJNIZVgQAQPEk55pR3XyHujnLLAASRw6kmgNloK9v4AFbKmuQkBAAA=

github-actions[bot]: ![badge](https://raw.githubusercontent.com/CS-SI/eodag/_xml_coverage_reports/data/http-asset-head/./badge.svg)


## Code Coverage (Ubuntu)

<details>


```
Filename                                     Stmts    Miss  Cover    Missing
-----------------------------------------  -------  ------  -------  ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
__init__.py                                      8       0  100.00%
cli.py                                         305      51  83.28%   60, 654-700, 802-853, 857
config.py                                      351      27  92.31%   81-83, 92, 100, 104-106, 183, 195, 460-462, 526-529, 576-577, 586-587, 666, 735-740, 742
crunch.py                                        5       5  0.00%    20-24
api/__init__.py                                  0       0  100.00%
api/core.py                                    762      84  88.98%   91-100, 373, 598, 642-645, 683, 720, 750, 798, 802-807, 833, 929, 1012, 1149, 1239-1251, 1291, 1293, 1321, 1325-1336, 1349-1355, 1445-1448, 1481-1501, 1557, 1574-1577, 1589-1592, 1614-1621, 1947, 1980-1986, 2253, 2257-2260, 2274-2276, 2311
api/search_result.py                            54       6  88.89%   33-35, 75, 84, 91, 105
api/product/__init__.py                          6       0  100.00%
api/product/_assets.py                          52       8  84.62%   28-30, 80, 157, 167, 170-174
api/product/_product.py                        195      27  86.15%   59-66, 70-72, 242-243, 325, 354, 415, 429-432, 445, 469-472, 515-521
api/product/metadata_mapping.py                678      83  87.76%   67-69, 131-133, 234, 266-267, 313-314, 324-336, 338, 349, 355-367, 412-413, 450, 471-474, 497, 505-506, 582-583, 607-608, 614-617, 632-633, 782, 828, 1002-1007, 1138, 1152-1172, 1192, 1197, 1307, 1329, 1343, 1356-1375, 1414, 1466, 1504-1508, 1527
api/product/drivers/__init__.py                  6       0  100.00%
api/product/drivers/base.py                      8       2  75.00%   23, 41
plugins/__init__.py                              0       0  100.00%
plugins/base.py                                 23       3  86.96%   25, 48, 55
plugins/manager.py                             134      15  88.81%   49-51, 105-110, 156, 197, 219, 223, 249, 288-289
plugins/apis/__init__.py                         0       0  100.00%
plugins/apis/base.py                             4       0  100.00%
plugins/apis/ecmwf.py                           99      15  84.85%   46-54, 150-152, 199-200, 226-228
plugins/apis/usgs.py                           186      36  80.65%   60-65, 132, 233, 267, 302-304, 309, 335-336, 341, 371-378, 389-394, 416-422, 424-430, 453
plugins/authentication/__init__.py               6       1  83.33%   31
plugins/authentication/aws_auth.py              20       2  90.00%   25-27
plugins/authentication/base.py                  19       3  84.21%   26, 34, 47
plugins/authentication/generic.py               16       3  81.25%   28, 40, 50
plugins/authentication/header.py                21       1  95.24%   28
plugins/authentication/keycloak.py              49       6  87.76%   33-35, 132, 156-161
plugins/authentication/oauth.py                 15       8  46.67%   25, 32-34, 38-41
plugins/authentication/openid_connect.py       185      19  89.73%   41-43, 119, 133-158, 166, 320-323, 347
plugins/authentication/qsauth.py                36       2  94.44%   32, 83
plugins/authentication/sas_auth.py              49       2  95.92%   32, 76
plugins/authentication/token.py                 90      17  81.11%   35-37, 79, 107, 109, 131-143, 198-201
plugins/authentication/token_exchange.py        35      19  45.71%   74-80, 92-120
plugins/crunch/__init__.py                       0       0  100.00%
plugins/crunch/base.py                          12       2  83.33%   26, 40
plugins/crunch/filter_date.py                   61      15  75.41%   30, 51-56, 70, 79, 88, 91, 103-105, 114-116, 123
plugins/crunch/filter_latest_intersect.py       50      10  80.00%   32-34, 51-52, 71, 80-83, 85, 92-95
plugins/crunch/filter_latest_tpl_name.py        33       2  93.94%   28, 87
plugins/crunch/filter_overlap.py                68      19  72.06%   28-30, 33, 72-75, 82-85, 91, 99, 110-126
plugins/crunch/filter_property.py               32       8  75.00%   29, 58-63, 66-67, 83-87
plugins/download/__init__.py                     0       0  100.00%
plugins/download/aws.py                        492     165  66.46%   77-83, 272, 285, 352-355, 369-373, 419-421, 425, 459-460, 466-470, 503, 538, 542, 549, 579-587, 591, 629-637, 644-646, 687-761, 779-840, 851-856, 872-885, 914, 929-931, 934, 944-952, 960-973, 983-1002, 1009-1021, 1062, 1088, 1133-1135, 1355
plugins/download/base.py                       260      57  78.08%   58-64, 145, 180, 319-320, 340-346, 377-381, 387-388, 432, 435-449, 461, 465, 538-542, 572-573, 581-598, 605-613, 615-619, 666, 688, 710, 718
plugins/download/creodias_s3.py                 17       9  47.06%   44-58
plugins/download/http.py                       540     135  75.00%   87-93, 204-216, 218-219, 254-257, 321-324, 326-327, 334-339, 357-372, 389-391, 403, 451, 458-464, 482, 496, 510, 518-520, 536-541, 552, 570, 612-616, 638, 678, 723, 737-743, 779-843, 861, 894-903, 929-930, 957-962, 968, 971, 987, 1004-1005, 1032-1033, 1040, 1102-1108, 1163-1164, 1170, 1180, 1214, 1250, 1268-1284, 1310-1312
plugins/download/s3rest.py                     119      27  77.31%   55-58, 121, 162, 197, 227-234, 237-239, 243, 256-262, 270-271, 274-278, 301, 322-325
plugins/search/__init__.py                      26       3  88.46%   27-31
plugins/search/base.py                         133      13  90.23%   48-53, 104, 108, 121, 271, 291, 350-351, 371, 380
plugins/search/build_search_result.py          183      24  86.89%   62, 97, 141-142, 148, 159, 295-298, 327, 384-401, 463, 466, 476, 493, 521, 523
plugins/search/cop_marine.py                   200      49  75.50%   43-44, 55, 63-65, 71-72, 88, 90, 93, 128-130, 142-143, 183-192, 196, 199, 203, 221, 251, 255, 270, 274, 278, 282, 286-290, 296-299, 302-316, 333, 356, 359, 365
plugins/search/creodias_s3.py                   55       3  94.55%   56, 74, 108
plugins/search/csw.py                          108      83  23.15%   44-46, 58-59, 63-64, 72-120, 126-139, 147-179, 197-238
plugins/search/data_request_search.py          202      68  66.34%   53, 90-93, 109, 121, 125-126, 137, 142, 147, 154, 167-170, 224-225, 229, 239-245, 250, 276-279, 287-298, 315, 317, 324-325, 327-328, 346-350, 383, 393, 404, 417, 423-438, 443
plugins/search/qssearch.py                     655      77  88.24%   103, 387, 391-397, 405-406, 512-518, 568, 584, 594, 621, 623, 666-669, 743-744, 792, 811, 826, 884, 905, 908-909, 918-919, 928-929, 938-939, 966, 1037-1042, 1046-1055, 1090, 1164, 1213, 1287-1291, 1357-1358, 1379, 1406-1418, 1425, 1457-1459, 1469-1475, 1519, 1534, 1556, 1665-1675
plugins/search/static_stac_search.py            75      12  84.00%   37-38, 101-128, 144, 157
rest/__init__.py                                 4       2  50.00%   21-22
rest/cache.py                                   33       7  78.79%   35-37, 53-55, 59, 68
rest/config.py                                  26       0  100.00%
rest/constants.py                                7       0  100.00%
rest/core.py                                   238      30  87.39%   83-87, 281, 365, 475, 702, 709-757
rest/server.py                                 286      55  80.77%   81-82, 108, 131-133, 246-248, 304-305, 317-333, 425-430, 458, 626-633, 662, 706-707, 730, 803-805, 822-827, 856, 858, 862-863, 867-868
rest/stac.py                                   466     123  73.61%   65-67, 320, 342, 390-393, 417-443, 448-454, 477-479, 502, 537-538, 566, 579, 624-664, 692-708, 787-800, 807, 863-864, 931, 999-1001, 1220, 1230-1242, 1255-1277, 1291-1336, 1498-1499
rest/types/__init__.py                           0       0  100.00%
rest/types/collections_search.py                13      13  0.00%    18-44
rest/types/eodag_search.py                     184       9  95.11%   52-55, 235-239, 292, 295, 363
rest/types/queryables.py                        58       2  96.55%   38, 172
rest/types/stac_search.py                      131      11  91.60%   51-54, 133, 179, 194-196, 204, 208
rest/utils/__init__.py                          95      13  86.32%   51, 108-109, 128-130, 182, 192-206
rest/utils/cql_evaluate.py                      48       5  89.58%   69, 76, 90, 97, 105
rest/utils/rfc3339.py                           23       3  86.96%   49, 61, 63
types/__init__.py                              110      11  90.00%   53, 70, 129-132, 199, 214-218, 245, 258
types/bbox.py                                   43      19  55.81%   46-61, 72-74, 85-87, 99-101, 113-115, 123
types/download_args.py                           9       0  100.00%
types/queryables.py                             81       0  100.00%
types/search_args.py                            70      18  74.29%   60-64, 71-88, 104
types/whoosh.py                                 15       0  100.00%
utils/__init__.py                              503      39  92.25%   84, 89, 110-112, 193-194, 203-230, 233, 247, 329-333, 409-413, 434-436, 518, 533, 571-572, 968-971, 979-980, 1021-1022, 1204
utils/constraints.py                           119      37  68.91%   94-103, 144, 149, 153, 164, 190-192, 202, 216-232, 241-252
utils/exceptions.py                             37       2  94.59%   23, 93
utils/import_system.py                          30      20  33.33%   27, 67-81, 93-103
utils/logging.py                                29       1  96.55%   123
utils/notebook.py                               44      23  47.73%   25-29, 36-41, 58-62, 72-78, 83-87
utils/repr.py                                   30       8  73.33%   36, 38, 42, 76, 94-101
utils/requests.py                               55      11  80.00%   69, 96, 98, 100, 102, 104, 123, 128-130, 138
utils/rest.py                                   36       1  97.22%   57
utils/stac_reader.py                           111      45  59.46%   56-57, 63-85, 95-97, 101, 143, 159-162, 215-224, 234-264
TOTAL                                         9672    1734  82.07%
```

</details>


### Diff against develop

```
Filename                    Stmts    Miss  Cover
------------------------  -------  ------  -------
plugins/download/http.py       +5      +3  -0.33%
TOTAL                          +5      +3  -0.02%
```


Results for commit: 0550b54d8e89d19217a8d8c0100601575429a964


_Minimum allowed coverage is `70%`_


:recycle: This comment has been updated with latest results


<!-- Sticky Pull Request Commentartifacts/unit-test-results-python3.12-ubuntu-latest/coverage.xml -->
github-actions[bot]: ![badge](https://raw.githubusercontent.com/CS-SI/eodag/_xml_coverage_reports_win/data/http-asset-head/./badge.svg)


## Code Coverage (Windows)

<details>


```
Filename                                     Stmts    Miss  Cover    Missing
-----------------------------------------  -------  ------  -------  ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
__init__.py                                      8       0  100.00%
cli.py                                         305      51  83.28%   60, 654-700, 802-853, 857
config.py                                      351      28  92.02%   81-83, 92, 100, 104-106, 183, 195, 460-462, 526-529, 576-577, 586-587, 666, 700, 735-740, 742
crunch.py                                        5       5  0.00%    20-24
api/__init__.py                                  0       0  100.00%
api/core.py                                    762      84  88.98%   91-100, 373, 598, 642-645, 683, 720, 750, 798, 802-807, 833, 929, 1012, 1149, 1239-1251, 1291, 1293, 1321, 1325-1336, 1349-1355, 1445-1448, 1481-1501, 1557, 1574-1577, 1589-1592, 1614-1621, 1947, 1980-1986, 2253, 2257-2260, 2274-2276, 2311
api/search_result.py                            54       6  88.89%   33-35, 75, 84, 91, 105
api/product/__init__.py                          6       0  100.00%
api/product/_assets.py                          52       8  84.62%   28-30, 80, 157, 167, 170-174
api/product/_product.py                        195      27  86.15%   59-66, 70-72, 242-243, 325, 354, 415, 429-432, 445, 469-472, 515-521
api/product/metadata_mapping.py                678      83  87.76%   67-69, 131-133, 234, 266-267, 313-314, 324-336, 338, 349, 355-367, 412-413, 450, 471-474, 497, 505-506, 582-583, 607-608, 614-617, 632-633, 782, 828, 1002-1007, 1138, 1152-1172, 1192, 1197, 1307, 1329, 1343, 1356-1375, 1414, 1466, 1504-1508, 1527
api/product/drivers/__init__.py                  6       0  100.00%
api/product/drivers/base.py                      8       2  75.00%   23, 41
plugins/__init__.py                              0       0  100.00%
plugins/base.py                                 23       4  82.61%   25, 48, 55, 68
plugins/manager.py                             134      15  88.81%   49-51, 105-110, 156, 197, 219, 223, 249, 288-289
plugins/apis/__init__.py                         0       0  100.00%
plugins/apis/base.py                             4       0  100.00%
plugins/apis/ecmwf.py                           99      15  84.85%   46-54, 150-152, 199-200, 226-228
plugins/apis/usgs.py                           186      36  80.65%   60-65, 132, 233, 267, 302-304, 309, 335-336, 341, 371-378, 389-394, 416-422, 424-430, 453
plugins/authentication/__init__.py               6       1  83.33%   31
plugins/authentication/aws_auth.py              20       2  90.00%   25-27
plugins/authentication/base.py                  19       3  84.21%   26, 34, 47
plugins/authentication/generic.py               16       3  81.25%   28, 40, 50
plugins/authentication/header.py                21       1  95.24%   28
plugins/authentication/keycloak.py              49       6  87.76%   33-35, 132, 156-161
plugins/authentication/oauth.py                 15       8  46.67%   25, 32-34, 38-41
plugins/authentication/openid_connect.py       185      19  89.73%   41-43, 119, 133-158, 166, 320-323, 347
plugins/authentication/qsauth.py                36       2  94.44%   32, 83
plugins/authentication/sas_auth.py              49       2  95.92%   32, 76
plugins/authentication/token.py                 90      17  81.11%   35-37, 79, 107, 109, 131-143, 198-201
plugins/authentication/token_exchange.py        35      19  45.71%   74-80, 92-120
plugins/crunch/__init__.py                       0       0  100.00%
plugins/crunch/base.py                          12       2  83.33%   26, 40
plugins/crunch/filter_date.py                   61      15  75.41%   30, 51-56, 70, 79, 88, 91, 103-105, 114-116, 123
plugins/crunch/filter_latest_intersect.py       50      35  30.00%   32-34, 48-53, 69-114
plugins/crunch/filter_latest_tpl_name.py        33       2  93.94%   28, 87
plugins/crunch/filter_overlap.py                68      19  72.06%   28-30, 33, 72-75, 82-85, 91, 99, 110-126
plugins/crunch/filter_property.py               32       8  75.00%   29, 58-63, 66-67, 83-87
plugins/download/__init__.py                     0       0  100.00%
plugins/download/aws.py                        492     165  66.46%   77-83, 272, 285, 352-355, 369-373, 419-421, 425, 459-460, 466-470, 503, 538, 542, 549, 579-587, 591, 629-637, 644-646, 687-761, 779-840, 851-856, 872-885, 914, 929-931, 934, 944-952, 960-973, 983-1002, 1009-1021, 1062, 1088, 1133-1135, 1355
plugins/download/base.py                       260      59  77.31%   58-64, 145, 180, 250-252, 319-320, 340-346, 377-381, 387-388, 432, 435-449, 461, 465, 538-542, 572-573, 581-598, 605-613, 615-619, 666, 688, 710, 718
plugins/download/creodias_s3.py                 17       9  47.06%   44-58
plugins/download/http.py                       540     135  75.00%   87-93, 204-216, 218-219, 254-257, 321-324, 326-327, 334-339, 357-372, 389-391, 403, 451, 458-464, 482, 496, 510, 518-520, 536-541, 552, 570, 612-616, 638, 678, 723, 737-743, 779-843, 861, 894-903, 929-930, 957-962, 968, 971, 987, 1004-1005, 1032-1033, 1040, 1102-1108, 1163-1164, 1170, 1180, 1214, 1250, 1268-1284, 1310-1312
plugins/download/s3rest.py                     119      27  77.31%   55-58, 121, 162, 197, 227-234, 237-239, 243, 256-262, 270-271, 274-278, 301, 322-325
plugins/search/__init__.py                      26       3  88.46%   27-31
plugins/search/base.py                         133      18  86.47%   48-53, 104, 108, 121, 271, 291, 350-351, 371, 374-382, 384
plugins/search/build_search_result.py          183      31  83.06%   62, 97, 141-142, 148, 159, 295-298, 327, 384-401, 463, 466, 476, 493, 513-528
plugins/search/cop_marine.py                   200      49  75.50%   43-44, 55, 63-65, 71-72, 88, 90, 93, 128-130, 142-143, 183-192, 196, 199, 203, 221, 251, 255, 270, 274, 278, 282, 286-290, 296-299, 302-316, 333, 356, 359, 365
plugins/search/creodias_s3.py                   55       3  94.55%   56, 74, 108
plugins/search/csw.py                          108      83  23.15%   44-46, 58-59, 63-64, 72-120, 126-139, 147-179, 197-238
plugins/search/data_request_search.py          202      68  66.34%   53, 90-93, 109, 121, 125-126, 137, 142, 147, 154, 167-170, 224-225, 229, 239-245, 250, 276-279, 287-298, 315, 317, 324-325, 327-328, 346-350, 383, 393, 404, 417, 423-438, 443
plugins/search/qssearch.py                     655     105  83.97%   103, 387, 391-397, 405-406, 512-518, 568, 571, 584, 594, 613-628, 666-669, 743-744, 792, 811, 826, 884, 905, 908-909, 918-919, 928-929, 938-939, 966, 1037-1042, 1046-1055, 1090, 1164, 1213, 1287-1291, 1357-1358, 1379, 1406-1418, 1425, 1457-1459, 1469-1475, 1519, 1534, 1556, 1624-1695
plugins/search/static_stac_search.py            75      12  84.00%   37-38, 101-128, 144, 157
rest/__init__.py                                 4       2  50.00%   21-22
rest/cache.py                                   33      22  33.33%   35-37, 44-70
rest/config.py                                  26       4  84.62%   34-36, 68
rest/constants.py                                7       0  100.00%
rest/core.py                                   238     153  35.71%   83-87, 167-248, 272-326, 339-375, 412-444, 464-480, 503-514, 523-559, 578, 624-663, 702, 709-757
rest/server.py                                 286     286  0.00%    18-879
rest/stac.py                                   466     394  15.45%   65-67, 128-134, 142-165, 196-201, 233, 253-376, 386-455, 473-512, 528-581, 591-614, 624-664, 692-708, 718, 734-737, 756-826, 844-880, 909-934, 942-958, 966-971, 981-1008, 1018-1020, 1028-1030, 1043-1045, 1059-1076, 1086-1107, 1117-1139, 1147-1164, 1187-1210, 1220, 1230-1242, 1255-1277, 1291-1336, 1344-1361, 1371-1529
rest/types/__init__.py                           0       0  100.00%
rest/types/collections_search.py                13      13  0.00%    18-44
rest/types/eodag_search.py                     184      19  89.67%   52-55, 125, 235-239, 272-274, 292, 295, 301, 305, 363, 375-378
rest/types/queryables.py                        58      14  75.86%   38, 51-52, 58-59, 65-66, 95-100, 109-110, 172
rest/types/stac_search.py                      131      22  83.21%   51-54, 131-133, 157-158, 163-164, 179, 194-196, 204, 208, 255-260
rest/utils/__init__.py                          95      31  67.37%   51, 79-85, 105, 108-109, 128-130, 143, 150, 175-183, 190-211
rest/utils/cql_evaluate.py                      48       5  89.58%   69, 76, 90, 97, 105
rest/utils/rfc3339.py                           23       6  73.91%   41, 44-45, 49, 61, 63
types/__init__.py                              110      36  67.27%   53, 66-70, 81-93, 120-122, 129-132, 172, 199, 209-221, 226, 245, 250, 258, 268
types/bbox.py                                   43      19  55.81%   46-61, 72-74, 85-87, 99-101, 113-115, 123
types/download_args.py                           9       0  100.00%
types/queryables.py                             81       0  100.00%
types/search_args.py                            70      18  74.29%   60-64, 71-88, 104
types/whoosh.py                                 15       0  100.00%
utils/__init__.py                              503      41  91.85%   84, 89, 110-112, 193-194, 203-230, 233, 247, 329-333, 409-413, 434-436, 518, 533, 571-572, 968-971, 979-980, 1021-1022, 1055, 1204, 1380
utils/constraints.py                           119      37  68.91%   94-103, 144, 149, 153, 164, 190-192, 202, 216-232, 241-252
utils/exceptions.py                             37       2  94.59%   23, 93
utils/import_system.py                          30      20  33.33%   27, 67-81, 93-103
utils/logging.py                                29       1  96.55%   123
utils/notebook.py                               44      23  47.73%   25-29, 36-41, 58-62, 72-78, 83-87
utils/repr.py                                   30       8  73.33%   36, 38, 42, 76, 94-101
utils/requests.py                               55      11  80.00%   69, 96, 98, 100, 102, 104, 123, 128-130, 138
utils/rest.py                                   36       1  97.22%   57
utils/stac_reader.py                           111      45  59.46%   56-57, 63-85, 95-97, 101, 143, 159-162, 215-224, 234-264
TOTAL                                         9672    2528  73.86%
```

</details>


### Diff against develop

```
Filename                    Stmts    Miss  Cover
------------------------  -------  ------  -------
plugins/download/http.py       +5      +3  -0.33%
TOTAL                          +5      +3  -0.02%
```


Results for commit: 0550b54d8e89d19217a8d8c0100601575429a964


_Minimum allowed coverage is `70%`_


:recycle: This comment has been updated with latest results


<!-- Sticky Pull Request Commentartifacts/unit-test-results-python3.12-windows-latest/coverage.xml -->

Patch:
diff --git a/eodag/plugins/authentication/aws_auth.py b/eodag/plugins/authentication/aws_auth.py
index 7b7c73ff..4023d264 100644
--- a/eodag/plugins/authentication/aws_auth.py
+++ b/eodag/plugins/authentication/aws_auth.py
@@ -35,6 +35,7 @@ class AwsAuth(Authentication):
     - auth anonymously using no-sign-request
     - auth using ``aws_profile``
     - auth using ``aws_access_key_id`` and ``aws_secret_access_key``
+      (optionally ``aws_session_token``)
     - auth using current environment (AWS environment variables and/or ``~/aws/*``),
       will be skipped if AWS credentials are filled in eodag conf
     """
@@ -45,6 +46,7 @@ class AwsAuth(Authentication):
         super(AwsAuth, self).__init__(provider, config)
         self.aws_access_key_id = None
         self.aws_secret_access_key = None
+        self.aws_session_token = None
         self.profile_name = None
 
     def authenticate(self) -> Dict[str, str]:
@@ -60,7 +62,15 @@ class AwsAuth(Authentication):
         self.aws_secret_access_key = credentials.get(
             "aws_secret_access_key", self.aws_secret_access_key
         )
+        self.aws_session_token = credentials.get(
+            "aws_session_token", self.aws_session_token
+        )
         self.profile_name = credentials.get("aws_profile", self.profile_name)
 
-        auth_keys = ["aws_access_key_id", "aws_secret_access_key", "profile_name"]
+        auth_keys = [
+            "aws_access_key_id",
+            "aws_secret_access_key",
+            "aws_session_token",
+            "profile_name",
+        ]
         return {k: getattr(self, k) for k in auth_keys if getattr(self, k)}
diff --git a/eodag/plugins/download/aws.py b/eodag/plugins/download/aws.py
index ce1f4def..c77766f0 100644
--- a/eodag/plugins/download/aws.py
+++ b/eodag/plugins/download/aws.py
@@ -34,6 +34,7 @@ from typing import (
     Optional,
     Set,
     Tuple,
+    TypedDict,
     Union,
     cast,
 )
@@ -229,7 +230,7 @@ class AwsDownload(Download):
     def __init__(self, provider: str, config: PluginConfig) -> None:
         super(AwsDownload, self).__init__(provider, config)
         self.requester_pays = getattr(self.config, "requester_pays", False)
-        self.s3_session = None
+        self.s3_session: Optional[boto3.session.Session] = None
 
     def download(
         self,
@@ -941,15 +942,15 @@ class AwsDownload(Download):
     ) -> Optional[ResourceCollection]:
         """Auth strategy using no-sign-request"""
 
-        s3_resource = boto3.resource(  # type: ignore
+        s3_resource = boto3.resource(
             service_name="s3", endpoint_url=getattr(self.config, "base_uri", None)
         )
-        s3_resource.meta.client.meta.events.register(  # type: ignore
+        s3_resource.meta.client.meta.events.register(
             "choose-signer.s3.*", disable_signing
         )
-        objects = s3_resource.Bucket(bucket_name).objects  # type: ignore
-        list(objects.filter(Prefix=prefix).limit(1))  # type: ignore
-        return objects  # type: ignore
+        objects = s3_resource.Bucket(bucket_name).objects
+        list(objects.filter(Prefix=prefix).limit(1))
+        return objects
 
     def _get_authenticated_objects_from_auth_profile(
         self, bucket_name: str, prefix: str, auth_dict: Dict[str, str]
@@ -957,20 +958,20 @@ class AwsDownload(Download):
         """Auth strategy using RequestPayer=requester and ``aws_profile`` from provided credentials"""
 
         if "profile_name" in auth_dict.keys():
-            s3_session = boto3.session.Session(profile_name=auth_dict["profile_name"])  # type: ignore
-            s3_resource = s3_session.resource(  # type: ignore
+            s3_session = boto3.session.Session(profile_name=auth_dict["profile_name"])
+            s3_resource = s3_session.resource(
                 service_name="s3",
                 endpoint_url=getattr(self.config, "base_uri", None),
             )
             if self.requester_pays:
-                objects = s3_resource.Bucket(bucket_name).objects.filter(  # type: ignore
+                objects = s3_resource.Bucket(bucket_name).objects.filter(
                     RequestPayer="requester"
                 )
             else:
-                objects = s3_resource.Bucket(bucket_name).objects  # type: ignore
-            list(objects.filter(Prefix=prefix).limit(1))  # type: ignore
-            self.s3_session = s3_session  # type: ignore
-            return objects  # type: ignore
+                objects = s3_resource.Bucket(bucket_name).objects
+            list(objects.filter(Prefix=prefix).limit(1))
+            self.s3_session = s3_session
+            return objects
         else:
             return None
 
@@ -981,23 +982,35 @@ class AwsDownload(Download):
         from provided credentials"""
 
         if all(k in auth_dict for k in ("aws_access_key_id", "aws_secret_access_key")):
-            s3_session = boto3.session.Session(  # type: ignore
-                aws_access_key_id=auth_dict["aws_access_key_id"],
-                aws_secret_access_key=auth_dict["aws_secret_access_key"],
+            S3SessionKwargs = TypedDict(
+                "S3SessionKwargs",
+                {
+                    "aws_access_key_id": str,
+                    "aws_secret_access_key": str,
+                    "aws_session_token": str,
+                },
+                total=False,
             )
-            s3_resource = s3_session.resource(  # type: ignore
+            s3_session_kwargs: S3SessionKwargs = {
+                "aws_access_key_id": auth_dict["aws_access_key_id"],
+                "aws_secret_access_key": auth_dict["aws_secret_access_key"],
+            }
+            if auth_dict.get("aws_session_token"):
+                s3_session_kwargs["aws_session_token"] = auth_dict["aws_session_token"]
+            s3_session = boto3.session.Session(**s3_session_kwargs)
+            s3_resource = s3_session.resource(
                 service_name="s3",
                 endpoint_url=getattr(self.config, "base_uri", None),
             )
             if self.requester_pays:
-                objects = s3_resource.Bucket(bucket_name).objects.filter(  # type: ignore
+                objects = s3_resource.Bucket(bucket_name).objects.filter(
                     RequestPayer="requester"
                 )
             else:
-                objects = s3_resource.Bucket(bucket_name).objects  # type: ignore
-            list(objects.filter(Prefix=prefix).limit(1))  # type: ignore
-            self.s3_session = s3_session  # type: ignore
-            return objects  # type: ignore
+                objects = s3_resource.Bucket(bucket_name).objects
+            list(objects.filter(Prefix=prefix).limit(1))
+            self.s3_session = s3_session
+            return objects
         else:
             return None
 
@@ -1006,19 +1019,19 @@ class AwsDownload(Download):
     ) -> Optional[ResourceCollection]:
         """Auth strategy using RequestPayer=requester and current environment"""
 
-        s3_session = boto3.session.Session()  # type: ignore
-        s3_resource = s3_session.resource(  # type: ignore
+        s3_session = boto3.session.Session()
+        s3_resource = s3_session.resource(
             service_name="s3", endpoint_url=getattr(self.config, "base_uri", None)
         )
         if self.requester_pays:
-            objects = s3_resource.Bucket(bucket_name).objects.filter(  # type: ignore
+            objects = s3_resource.Bucket(bucket_name).objects.filter(
                 RequestPayer="requester"
             )
         else:
-            objects = s3_resource.Bucket(bucket_name).objects  # type: ignore
-        list(objects.filter(Prefix=prefix).limit(1))  # type: ignore
-        self.s3_session = s3_session  # type: ignore
-        return objects  # type: ignore
+            objects = s3_resource.Bucket(bucket_name).objects
+        list(objects.filter(Prefix=prefix).limit(1))
+        self.s3_session = s3_session
+        return objects
 
     def get_product_bucket_name_and_prefix(
         self, product: EOProduct, url: Optional[str] = None
diff --git a/eodag/plugins/download/http.py b/eodag/plugins/download/http.py
index 9eb55569..9437c3d1 100644
--- a/eodag/plugins/download/http.py
+++ b/eodag/plugins/download/http.py
@@ -45,6 +45,7 @@ import requests
 from lxml import etree
 from requests import RequestException
 from requests.auth import AuthBase
+from requests.structures import CaseInsensitiveDict
 from stream_zip import ZIP_AUTO, stream_zip
 
 from eodag.api.product.metadata_mapping import (
@@ -1297,12 +1298,18 @@ class HTTPDownload(Download):
         for asset in assets_values:
             if asset["href"] and not asset["href"].startswith("file:"):
                 # HEAD request for size & filename
-                asset_headers = requests.head(
-                    asset["href"],
-                    auth=auth,
-                    headers=USER_AGENT,
-                    timeout=timeout,
-                ).headers
+                try:
+                    asset_headers = requests.head(
+                        asset["href"],
+                        auth=auth,
+                        params=params,
+                        headers=USER_AGENT,
+                        timeout=timeout,
+                        verify=ssl_verify,
+                    ).headers
+                except RequestException as e:
+                    logger.debug(f"HEAD request failed: {str(e)}")
+                    asset_headers = CaseInsensitiveDict()
 
                 if not getattr(asset, "size", 0):
                     # size from HEAD header / Content-length


Test patch:
diff --git a/tests/units/test_auth_plugins.py b/tests/units/test_auth_plugins.py
index c6d03a7d..8f1f90ae 100644
--- a/tests/units/test_auth_plugins.py
+++ b/tests/units/test_auth_plugins.py
@@ -327,6 +327,76 @@ class TestAuthPluginTokenAuth(BaseAuthPluginTest):
                 auth_plugin.authenticate()
 
 
+class TestAuthPluginAwsAuth(BaseAuthPluginTest):
+    @classmethod
+    def setUpClass(cls):
+        super(TestAuthPluginAwsAuth, cls).setUpClass()
+        cls.aws_access_key_id = "my_access_key"
+        cls.aws_secret_access_key = "my_secret_key"
+        cls.aws_session_token = "my_session_token"
+        cls.profile_name = "my_profile"
+        override_config_from_mapping(
+            cls.providers_config,
+            {
+                "provider_with_auth_keys": {
+                    "products": {"foo_product": {}},
+                    "auth": {
+                        "type": "AwsAuth",
+                        "credentials": {
+                            "aws_access_key_id": cls.aws_access_key_id,
+                            "aws_secret_access_key": cls.aws_secret_access_key,
+                        },
+                    },
+                },
+                "provider_with_auth_keys_session": {
+                    "products": {"foo_product": {}},
+                    "auth": {
+                        "type": "AwsAuth",
+                        "credentials": {
+                            "aws_access_key_id": cls.aws_access_key_id,
+                            "aws_secret_access_key": cls.aws_secret_access_key,
+                            "aws_session_token": cls.aws_session_token,
+                        },
+                    },
+                },
+                "provider_with_auth_profile": {
+                    "products": {"foo_product": {}},
+                    "auth": {
+                        "type": "AwsAuth",
+                        "credentials": {
+                            "aws_profile": cls.profile_name,
+                        },
+                    },
+                },
+            },
+        )
+        cls.plugins_manager = PluginManager(cls.providers_config)
+
+    def test_plugins_auth_aws_authenticate(self):
+        """AwsAuth.authenticate must return credentials in a dict"""
+        self.assertDictEqual(
+            self.get_auth_plugin("provider_with_auth_keys").authenticate(),
+            {
+                "aws_access_key_id": self.aws_access_key_id,
+                "aws_secret_access_key": self.aws_secret_access_key,
+            },
+        )
+        self.assertDictEqual(
+            self.get_auth_plugin("provider_with_auth_keys_session").authenticate(),
+            {
+                "aws_access_key_id": self.aws_access_key_id,
+                "aws_secret_access_key": self.aws_secret_access_key,
+                "aws_session_token": self.aws_session_token,
+            },
+        )
+        self.assertDictEqual(
+            self.get_auth_plugin("provider_with_auth_profile").authenticate(),
+            {
+                "profile_name": self.profile_name,
+            },
+        )
+
+
 class TestAuthPluginHTTPHeaderAuth(BaseAuthPluginTest):
     @classmethod
     def setUpClass(cls):
diff --git a/tests/units/test_download_plugins.py b/tests/units/test_download_plugins.py
index 6e7c77ae..e8e0574e 100644
--- a/tests/units/test_download_plugins.py
+++ b/tests/units/test_download_plugins.py
@@ -595,6 +595,14 @@ class TestDownloadPluginHttp(BaseDownloadPluginTest):
         plugin.config.ssl_verify = False
 
         plugin.download(self.product, outputs_prefix=self.output_dir)
+        mock_requests_head.assert_called_once_with(
+            self.product.assets["foo"]["href"],
+            auth=None,
+            params=plugin.config.dl_url_params,
+            headers=USER_AGENT,
+            timeout=HTTP_REQ_TIMEOUT,
+            verify=False,
+        )
         mock_requests_get.assert_called_once_with(
             self.product.assets["foo"]["href"],
             stream=True,
@@ -651,8 +659,10 @@ class TestDownloadPluginHttp(BaseDownloadPluginTest):
         mock_requests_head.assert_called_once_with(
             self.product.assets["foo"]["href"],
             auth=None,
+            params=plugin.config.dl_url_params,
             headers=USER_AGENT,
             timeout=HTTP_REQ_TIMEOUT,
+            verify=True,
         )
 
     @mock.patch("eodag.plugins.download.http.requests.head", autospec=True)