Repository: pvlib/pvlib-python

Issue:
Update get_cams protocol to https
According to an email sent out by Transvalor on May 12th 2022, the SoDa websites and services will switch from using "HTTP" to only "HTTPS". 

The existing HTTP endpoints will redirect to the correct HTTPS sites, hence without any changes the [`get_cams`](https://pvlib-python.readthedocs.io/en/stable/reference/generated/pvlib.iotools.get_cams.html) function will continue to work correctly (as the request package handles redirects automatically). However, for good practice and to avoid unnecessary redirects, updating the existing URLs and endpoints to HTTPS is surely a good idea:
https://github.com/pvlib/pvlib-python/blob/a0812b12584cfd5e662fa5aeb8972090763a671f/pvlib/iotools/sodapro.py#L188

<br>
For reference, here's a screen-shot of Transvalor email:

![image](https://user-images.githubusercontent.com/39184289/168595497-095c17c1-3fec-43c9-b6fd-49c928b51d78.png)

FYI: this is a good first issue to tackle to get familiar with contribution to pvlib :) 


Discussion:

Patch:
diff --git a/pvlib/iotools/sodapro.py b/pvlib/iotools/sodapro.py
--- a/pvlib/iotools/sodapro.py
+++ b/pvlib/iotools/sodapro.py
@@ -153,11 +153,11 @@ def get_cams(latitude, longitude, start, end, email, identifier='mcclear',
     References
     ----------
     .. [1] `CAMS Radiation Service Info
-       <http://www.soda-pro.com/web-services/radiation/cams-radiation-service/info>`_
+       <https://www.soda-pro.com/web-services/radiation/cams-radiation-service/info>`_
     .. [2] `CAMS McClear Service Info
-       <http://www.soda-pro.com/web-services/radiation/cams-mcclear/info>`_
+       <https://www.soda-pro.com/web-services/radiation/cams-mcclear/info>`_
     .. [3] `CAMS McClear Automatic Access
-       <http://www.soda-pro.com/help/cams-services/cams-mcclear-service/automatic-access>`_
+       <https://www.soda-pro.com/help/cams-services/cams-mcclear-service/automatic-access>`_
     """
     try:
         time_step_str = TIME_STEPS_MAP[time_step]
@@ -185,7 +185,7 @@ def get_cams(latitude, longitude, start, end, email, identifier='mcclear',
     email = email.replace('@', '%2540')  # Format email address
     identifier = 'get_{}'.format(identifier.lower())  # Format identifier str
 
-    base_url = f"http://{server}/service/wps"
+    base_url = f"https://{server}/service/wps"
 
     data_inputs_dict = {
         'latitude': latitude,
@@ -263,9 +263,9 @@ def parse_cams(fbuf, integrated=False, label=None, map_variables=True):
     References
     ----------
     .. [1] `CAMS Radiation Service Info
-       <http://www.soda-pro.com/web-services/radiation/cams-radiation-service/info>`_
+       <https://www.soda-pro.com/web-services/radiation/cams-radiation-service/info>`_
     .. [2] `CAMS McClear Service Info
-       <http://www.soda-pro.com/web-services/radiation/cams-mcclear/info>`_
+       <https://www.soda-pro.com/web-services/radiation/cams-mcclear/info>`_
     """
     metadata = {}
     # Initial lines starting with # contain metadata
@@ -366,9 +366,9 @@ def read_cams(filename, integrated=False, label=None, map_variables=True):
     References
     ----------
     .. [1] `CAMS Radiation Service Info
-       <http://www.soda-pro.com/web-services/radiation/cams-radiation-service/info>`_
+       <https://www.soda-pro.com/web-services/radiation/cams-radiation-service/info>`_
     .. [2] `CAMS McClear Service Info
-       <http://www.soda-pro.com/web-services/radiation/cams-mcclear/info>`_
+       <https://www.soda-pro.com/web-services/radiation/cams-mcclear/info>`_
     """
     with open(str(filename), 'r') as fbuf:
         content = parse_cams(fbuf, integrated, label, map_variables)


Test patch:
diff --git a/pvlib/tests/iotools/test_sodapro.py b/pvlib/tests/iotools/test_sodapro.py
--- a/pvlib/tests/iotools/test_sodapro.py
+++ b/pvlib/tests/iotools/test_sodapro.py
@@ -209,7 +209,7 @@ def test_get_cams(requests_mock, testfile, index, columns, values, dtypes,
         mock_response = test_file.read()
     # Specify the full URI of a specific example, this ensures that all of the
     # inputs are passing on correctly
-    url_test_cams = f'http://www.soda-is.com/service/wps?DataInputs=latitude=55.7906;longitude=12.5251;altitude=80;date_begin=2020-01-01;date_end=2020-05-04;time_ref=UT;summarization=P01M;username=pvlib-admin%2540googlegroups.com;verbose=false&Service=WPS&Request=Execute&Identifier=get_{identifier}&version=1.0.0&RawDataOutput=irradiation'  # noqa: E501
+    url_test_cams = f'https://www.soda-is.com/service/wps?DataInputs=latitude=55.7906;longitude=12.5251;altitude=80;date_begin=2020-01-01;date_end=2020-05-04;time_ref=UT;summarization=P01M;username=pvlib-admin%2540googlegroups.com;verbose=false&Service=WPS&Request=Execute&Identifier=get_{identifier}&version=1.0.0&RawDataOutput=irradiation'  # noqa: E501
 
     requests_mock.get(url_test_cams, text=mock_response,
                       headers={'Content-Type': 'application/csv'})
@@ -254,7 +254,7 @@ def test_get_cams_bad_request(requests_mock):
         Please, register yourself at www.soda-pro.com
     </ows:ExceptionText>"""
 
-    url_cams_bad_request = 'http://pro.soda-is.com/service/wps?DataInputs=latitude=55.7906;longitude=12.5251;altitude=-999;date_begin=2020-01-01;date_end=2020-05-04;time_ref=TST;summarization=PT01H;username=test%2540test.com;verbose=false&Service=WPS&Request=Execute&Identifier=get_mcclear&version=1.0.0&RawDataOutput=irradiation'  # noqa: E501
+    url_cams_bad_request = 'https://pro.soda-is.com/service/wps?DataInputs=latitude=55.7906;longitude=12.5251;altitude=-999;date_begin=2020-01-01;date_end=2020-05-04;time_ref=TST;summarization=PT01H;username=test%2540test.com;verbose=false&Service=WPS&Request=Execute&Identifier=get_mcclear&version=1.0.0&RawDataOutput=irradiation'  # noqa: E501
 
     requests_mock.get(url_cams_bad_request, text=mock_response_bad,
                       headers={'Content-Type': 'application/xml'})