Repository: docker/docker-py
Issue: Deleting a volume with volume name containing blanks failed using docker python sdk

Description:
Creating a volume with the volume name contains a blank successfully，but delete the volume failed. When deleting the volume that the name contains a blank, the blank is decoded to "+". 
Steps to Reproduce:
1. Create a docker python client
2. Create a volume with name "vo1 test_-" using the client
3. List volumes using the client
4. Delete the volume "vo1 test_-" using the client
The command and errors:
>>> import docker
>>> client = docker.DockerClient(base_url='tcp://ci-docker-node1:2375')
>>> client.volumes.create(name='vo1 test_-', driver='ubiquity', driver_opts={'size': "5", 'profile': 'gold'})
<Volume: vo1 test_->
>>> created_volume=client.volumes.list()
>>> created_volume
[<Volume: vo1 test_->]
>>> created_volume[0].remove()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Users/wangyd/xenv/lib/python2.7/site-packages/docker/models/volumes.py", line 25, in remove
    return self.client.api.remove_volume(self.id, force=force)
  File "/Users/wangyd/xenv/lib/python2.7/site-packages/docker/utils/decorators.py", line 34, in wrapper
    return f(self, *args, **kwargs)
  File "/Users/wangyd/xenv/lib/python2.7/site-packages/docker/api/volume.py", line 165, in remove_volume
    self._raise_for_status(resp)
  File "/Users/wangyd/xenv/lib/python2.7/site-packages/docker/api/client.py", line 222, in _raise_for_status
    raise create_api_error_from_http_exception(e)
  File "/Users/wangyd/xenv/lib/python2.7/site-packages/docker/errors.py", line 31, in create_api_error_from_http_exception
    raise cls(e, response=response, explanation=explanation)
docker.errors.NotFound: 404 Client Error: Not Found ("get vo1+test_-: no such volume")
>>> 


Changed files:
tests/integration/api_network_test.py, docker/api/client.py

diff --git a/docker/api/client.py b/docker/api/client.py
index cbe74b91..01a83ea4 100644
--- a/docker/api/client.py
+++ b/docker/api/client.py
@@ -206,7 +206,7 @@ class APIClient(
                     'instead'.format(arg, type(arg))
                 )
 
-        quote_f = partial(six.moves.urllib.parse.quote_plus, safe="/:")
+        quote_f = partial(six.moves.urllib.parse.quote, safe="/:")
         args = map(quote_f, args)
 
         if kwargs.get('versioned_api', True):
diff --git a/tests/integration/api_network_test.py b/tests/integration/api_network_test.py
index f4fefde5..10e09dd7 100644
--- a/tests/integration/api_network_test.py
+++ b/tests/integration/api_network_test.py
@@ -484,3 +484,10 @@ class TestNetworks(BaseAPIIntegrationTest):
         assert self.client.inspect_network(net_name_swarm, scope='swarm')
         with pytest.raises(docker.errors.NotFound):
             self.client.inspect_network(net_name_swarm, scope='local')
+
+    @requires_api_version('1.21')
+    def test_create_remove_network_with_space_in_name(self):
+        net_id = self.client.create_network('test 01')
+        self.tmp_networks.append(net_id)
+        assert self.client.inspect_network('test 01')
+        assert self.client.remove_network('test 01') is None  # does not raise