Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

OneDrive for business? #16

Closed
ryanccarter opened this issue Jan 14, 2016 · 15 comments
Closed

OneDrive for business? #16

ryanccarter opened this issue Jan 14, 2016 · 15 comments

Comments

@ryanccarter
Copy link

Does this SDK support OneDrive for business?

Thanks.

@cdmayer
Copy link
Contributor

cdmayer commented Jan 14, 2016

We're in Beta support for OneDrive for Business. Really, the main thing you have to change is the base_url when you create your OneDriveClient object. Here's the section from the (OneDrive API docs)[https://dev.onedrive.com/README.htm]:

2. Make calls against a URL root

Now that you've authenticated your app, you can call the OneDrive API with your access token against the URL root below, combined with one of the root resources. See Drive resource and Item resource for examples on how to make calls to the OneDrive API. OneDrive API URLs are relative to the following root unless otherwise noted.

Service URL Root
OneDrive https://api.onedrive.com/v1.0
OneDrive for Business https://{tenant}-my.sharepoint.com/_api/v2.0

So you just need to know your tenant prefix, substitute it into the URL above, then give that to the OneDriveClient constructor as the base_url.

After that, you use the Python SDK the same against both services.

@ryanccarter
Copy link
Author

Thanks a lot for the quick reply. I will give that a try.

@ilmaisin
Copy link

Sorry if I am asking dumb questions, but if I want to adapt, say, CommandLineFileExplorer.py to use OneDrive for Business, how can I do it? I even tried to change base_url globally from onedrivesdk_helper.py and recompiled it, but it had no effect: it just pointed me to consumer OneDrive's authentication page.

@cdmayer
Copy link
Contributor

cdmayer commented May 24, 2016

Please take a look at the StackOverflow thread about this: http://stackoverflow.com/questions/37233669/onedrive-api-python-sdk-points-to-login-live-com-not-mydomain-sharepoint-com/37244587?noredirect=1#comment62021706_37244587

If you still have questions after that, let me know!

@ilmaisin
Copy link

ilmaisin commented Jun 5, 2016

I tried those suggestions in the URL, but still can't get it right. Could you point me where is the problem in this code? It keeps redirecting me to the consumer login page, not my school's login page.

from __future__ import unicode_literals

import onedrivesdk
from onedrivesdk.helpers import GetAuthCodeServer
from PIL import Image
import os

input = getattr(__builtins__, 'raw_input', input)

def main():
    onedrive_base_url = "https://tuas365-my.sharepoint.com/_api/v2.0"
    redirect_uri = "http://localhost:8080/"
    client_secret = "removed"
    AUTH_SERVER_URL = "https://login.microsoftonline.com/common/oauth2/authorize"
    AUTH_TOKEN_URL = "https://login.microsoftonline.com/common/oauth2/token"


#    client = onedrivesdk.get_default_client(client_id='00000000481695BB',
#                                            scopes=['wl.signin',
#                                                    'wl.offline_access',
#                                                    'onedrive.readwrite'])

    http_provider = onedrivesdk.HttpProvider()
    auth_provider = onedrivesdk.AuthProvider(http_provider=http_provider,
                             client_id="00000000481695BB",
                             scopes=['wl.signin',
                                     'wl.offline_access',
                                     'onedrive.readwrite'])
    client = onedrivesdk.OneDriveClient("tuas365-my.sharepoint.com",
                        auth_provider,
                        http_provider)
    auth_url = client.auth_provider.get_auth_url(redirect_uri)

    # Block thread until we have the code
    code = GetAuthCodeServer.get_auth_code(auth_url, redirect_uri)
    # Finally, authenticate!
    client.auth_provider.authenticate(code, redirect_uri, client_secret)
    item_id = "root"
    copy_item_ids = None
    action = 0

    while True:
        items = navigate(client, item_id)
        print("0: UP")
        count = 0
        for count, item in enumerate(items):
            print("{} {}".format(count+1, item.name if item.folder is None else "/"+item.name))

        selected = input("Select item, enter 'C' to copy all, enter 'L' to list changes in current folder: ")

        if selected == "C":
            copy_item_ids = []
            for item in items:
                copy_item_ids.append(item.id)

        elif selected == "L":
            token = input("Enter your token, or nothing if you do not have one: ")
            list_changes(client, item_id, token)

        else:
            selected = int(selected)

            if selected == 0:
                item_id = get_parent_id(client, item_id)
            else:
                action = int(input("Select action: 1:Navigate 2:Rename 3:View Thumbnail 4: Get Sharing Link 5: List Changes 6:Download 7:Upload 8:Delete 9:Copy{}... ".format(" 10: Paste" if copy_item_ids else "")))
                if items[selected-1].folder is None or (action != 6 and action != 1):
                    if action == 1:
                        print("Can't navigate a file")
                    elif action == 2:
                        rename(client, items[selected-1].id)
                    elif action == 3:
                        view_thumbnail(client, items[selected-1].id)
                    elif action == 4:
                        get_sharing_link(client, items[selected-1].id)
                    elif action == 5:
                        token = input("Enter your token, or nothing if you do not have one: ")
                        list_changes(client, items[selected-1].id, token)
                    elif action == 6:
                        download(client, items[selected-1].id)
                    elif action == 7:
                        if item.folder is None:
                            print("You cannot upload to a file")
                        else:
                            upload(client, items[selected-1].id)
                    elif action == 8:
                        delete(client, items[selected-1].id)
                    elif action == 9:
                        copy_item_ids = [items[selected-1].id]
                    elif action == 10 and copy_item_ids:
                        if items[selected-1].folder:
                            paste(client, items[selected-1].id, copy_item_ids)
                        else:
                            print("Can't copy to a file")
                else:
                    item_id = items[selected-1].id


def navigate(client, item_id):
    items = client.item(id=item_id).children.get()
    return items


def rename(client, item_id):
    new_name = input("Enter new name: ")
    renamed_item = onedrivesdk.Item()
    renamed_item.name = new_name
    renamed_item.id = item_id
    client.item(id=item_id).update(renamed_item)


def view_thumbnail(client, item_id):
    if len(client.item(id=item_id).thumbnails.get()) == 0:
        print("File does not have any thumbnails!\n")
    else:
        action = int(input("Size? 1:Small 2:Medium 3:Large... "))
        try:
            os.remove("./tmp_thumb.jpg")
        except:
            pass
        if action == 1:
            client.item(id=item_id).thumbnails[0].small.download("./tmp_thumb.jpg")
        elif action == 2:
            client.item(id=item_id).thumbnails[0].medium.download("./tmp_thumb.jpg")
        elif action == 3:
            client.item(id=item_id).thumbnails[0].large.download("./tmp_thumb.jpg")
        image = Image.open("./tmp_thumb.jpg")
        image.show()


def get_sharing_link(client, item_id):
    action = int(input("Type? 1:View 2:Edit... "))
    permission = client.item(id=item_id).create_link("view" if action == 1 else "edit").post()
    print("\n{}\n".format(permission.link.web_url))


def download(client, item_id):
    directory = input("Enter download directory (can be relative): ")
    client.item(id=item_id).download(directory)


def upload(client, item_id):
    directory = input("Enter upload file directory (can be relative): ")
    name = input("Enter file name with extension: ")
    client.item(id=item_id).children[name].upload(directory)


def delete(client, item_id):
    confirm = input("Confirm delete? Y/N: ")
    if confirm == "Y":
        client.item(id=item_id).delete()


def paste(client, item_id, copy_item_ids):
    ref = onedrivesdk.ItemReference()
    ref.id = item_id
    for id in copy_item_ids:
        client.item(id=id).copy(parent_reference=ref).post()


def list_changes(client, item_id, token):
    collection_page = client.item(id=item_id).delta(token).get()
    for item in collection_page:
        print(item.name)

    print("TOKEN: {}".format(collection_page.token))


def get_parent_id(client, item_id):
    id = client.item(id=item_id).get().parent_reference.id
    return id

if __name__ == "__main__":
    main()

@cdmayer
Copy link
Contributor

cdmayer commented Jun 6, 2016

First off, do this RIGHT NOW: edit your comment and remove your client_secret! You are letting anyone on GitHub pretend they are your app. Protect your secret the same way you would protect your password to your Microsoft account.

You are creating AUTH_SERVER_URL & AUTH_TOKEN_URL in the local context instead of setting them in the class. At the top of your main() function change these lines:

onedrivesdk.AuthProvider.AUTH_SERVER_URL = "https://login.microsoftonline.com/common/oauth2/authorize"
onedrivesdk.AuthProvider.AUTH_TOKEN_URL = "https://login.microsoftonline.com/common/oauth2/token"

OneDrive for Business does not require scopes, so just delete the contents of the scopes list. It probably isn't causing any failures but it's cleaner.

If you have any other issues, go ahead and post them. Make sure to post it with any error messages you're getting, as they'll be helpful in further debugging.

@cdmayer
Copy link
Contributor

cdmayer commented Jun 6, 2016

You can get further information about AAD authentication on OneDrive here: https://dev.onedrive.com/auth/aad_oauth.htm.

@ilmaisin
Copy link

ilmaisin commented Jun 6, 2016

I edited the message and removed the client secret. It does not seem to be authenticated anywhere, but it doesn't hurt to be sure. The client secrets could also be removed from the example files in here Github, since if someone runs them, security can get compromised.

Now it redirects to the correct page, but still seems to not work just right, but outputs "Bad request" errors. If i am logged out from the school account, the error is AADSTS90019: No tenant-identifying information found in either the request or implied by any provided credentials. If I am logged in, it's AADSTS70001: Application with identifier '00000000481695BB' was not found in the directory edu.turkuamk.fi.

@cdmayer
Copy link
Contributor

cdmayer commented Jun 6, 2016

It sounds like your app has not been registered with your ODB tenant. You can read more here: https://dev.onedrive.com/app-registration.htm#register-your-app-for-onedrive-for-business.

@dmasson
Copy link
Contributor

dmasson commented Jun 10, 2016

Hello , .. following @cdmayer 's instructions I was wable to authenticate , .. now I'm stuck in the authenticate method , .. I'm getting invalid_resource error, here's the example source code, and the terminal output:

import onedrivesdk
from onedrivesdk.helpers import GetAuthCodeServer

redirect_uri = "http://localhost:8080"
client_secret = "removed"

onedrivesdk.AuthProvider.AUTH_SERVER_URL = "https://login.microsoftonline.com/3c8cb82e-4ec9-4e07-8357-e28f1d4738da/oauth2/authorize"
onedrivesdk.AuthProvider.AUTH_TOKEN_URL = "https://login.microsoftonline.com/3c8cb82e-4ec9-4e07-8357-e28f1d4738da/oauth2/token"

client = onedrivesdk.get_default_client(client_id='a52fc71b-9d88-4544-98bc-01b906f368d6',
                                        scopes=[])

auth_url = client.auth_provider.get_auth_url(redirect_uri)

#this will block until we have the code
code = GetAuthCodeServer.get_auth_code(auth_url, redirect_uri)

client.auth_provider.authenticate(code, redirect_uri, client_secret)

Terminal output: (I added a couple of prints to the http_response.py to see the complete response):

127.0.0.1 - - [10/Jun/2016 14:13:51] "GET /?code=AAABAAAAiL9Kn2Z27UubvWFPbm0gLYo2GTWGapJDqAUnnJ0atxVRiYK-E3Gsz1Ryz3pJmawtVggARQgeSTDPZvCy0Up6ddXuBT0JDzLJ7RUwtv0pwsoF34aPk-vb7RUedg0TZrmyPJygO7R78pWsA-kg1b6yJoEAPGIqL-vWJGyU1FcAVEI-sTuXpgL0eNwDPSOS75J_ry6zVUDnltgjK5AY1liXrqsZ-2p-pUt1pDdv3UkmO3lPZIaeSo6fNw1Yz65CC2gNx5OCtLDADxGdqJtd5YX8EY-elkOq00DOuyG0rsVcP8ZfCwZDIQbn4okKj7r9mTER_BnPFkKA1Ohmj2Dd8Al9n9mHC5j9TtvlssJ93DcjrkdbsZTWas6z0dkXcgDdnkEH6bJIFlfqPR4dm1dyrXt0urkFp4tJL-wvZrzgqVLh-GI2xUV6_Ot1ru7KgJfpJDRaKJy0GIwaYqrSdyy6p15XiZFghzaCCHsoB5SBnUqkNwpWtFMDhP2mJCKUE6PBMhj-KxXAksqM2aLL8pxvEAa6PLz_DdMH2Ks6juIRQV7lIrQNkujSORQx_Z-YzEmu8d8IyBF2jEgFYmNDaJVwGOpVOzjvRYp4AOaJJGoFf0eMOzYDXuqYC5fqHVOnFFljlIHrjqzl2pADsLWtuA4D6qvyyrByBLXifhBP1HPbJRPbSKYgAA&session_state=b7dc0d8d-217a-4354-8cfc-aeb0edfba4c5 HTTP/1.1" 200 -
https://login.microsoftonline.com/3c8cb82e-4ec9-4e07-8357-e28f1d4738da/oauth2/token
400
{"error":"invalid_resource","error_description":"AADSTS50001: Resource identifier is not provided.\r\nTrace ID: 2660f499-77b5-4a52-8566-d534b57c949e\r\nCorrelation ID: a4cd2b85-0f68-4398-b74e-c962381093f9\r\nTimestamp: 2016-06-10 19:13:51Z","error_codes":[50001],"timestamp":"2016-06-10 19:13:51Z","trace_id":"2660f499-77b5-4a52-8566-d534b57c949e","correlation_id":"a4cd2b85-0f68-4398-b74e-c962381093f9"}
Traceback (most recent call last):
  File "one-drive-backup.py", line 18, in <module>
    client.auth_provider.authenticate(code, redirect_uri, client_secret)
  File "/Users/danielmasson/virtualenv/onedrive-cli/lib/python2.7/site-packages/onedrivesdk/auth_provider.py", line 166, in authenticate
    data=params)
  File "/Users/danielmasson/virtualenv/onedrive-cli/lib/python2.7/site-packages/onedrivesdk/http_provider.py", line 71, in send
    custom_response = HttpResponse(response.status_code, response.headers, response.text)
  File "/Users/danielmasson/virtualenv/onedrive-cli/lib/python2.7/site-packages/onedrivesdk/http_response.py", line 54, in __init__
    raise Exception(str(message["error"]))
Exception: invalid_resource

@cdmayer
Copy link
Contributor

cdmayer commented Jun 10, 2016

Your url's are incorrect. You should have the following:

onedrivesdk.AuthProvider.AUTH_SERVER_URL = "https://login.microsoftonline.com/common/oauth2/authorize"
onedrivesdk.AuthProvider.AUTH_TOKEN_URL = "https://login.microsoftonline.com/common/oauth2/token"

@dmasson
Copy link
Contributor

dmasson commented Jun 10, 2016

Hi , .. i just changed the URLs as suggested, getting the same error, here's more info, I hardcoded the a "resource" key in the authenticate method:

params = {
    "code": code,
    "client_id": self.client_id,
    "redirect_uri": redirect_uri,
    "grant_type": "authorization_code",
    "resource": "https://cnpx-my.sharepoint.com/"
}

the output had no errors:

127.0.0.1 - - [10/Jun/2016 14:55:11] "GET /?code=AAABAAAAiL9Kn2Z27UubvWFPbm0gLettLv0BHrkctfiJR_1V76ltzRZb1Ki2gn5mX4te-zWLixOJyDL4AtIGKe2DQ4-uF1C66_eQP9OIFg3Wb15PRYCXRH3f0J_FRRYbb1yAy81J5tpdPO5r6RGMpy0a3KCzjSt76ck0_S-OdjDO7uY3cJKfZHRy3BXeGpQebgcTFVJIZR5Kp-4HS08eSQIvszOlAgG58vJQNkhnnSU0nLccZF7AgkM8hsf-dvC5KMc3WmVw44r5RVa04bLB5UZn6pOA3bDXoydvDpHKsmTN0uZZuVqDgRKm4YdP0ItE5XEPkSnFygCVeXUTL8hkbKAIMEV5NtLbLiASLJylcvZzanHcXyjb2SqNAO6U5M962LDDiq-CxjnZgo9inNuTbZJOQmzlvBx5fkTg63rcNP5eW7k3qjAMKC6CTQjaMBiIkZ_NTG7SbOralw1DXQi2bq0IuFEEqxmD8ltHv09Ln_tHsnFoaPOMnw40eQ9fsenBcQhvwRfVQM08hom6wEi2zawbcnUeiJMsK5GGtrTxzfPvHbd6ckL4bRGdzCm7VHVQ-2JdShNr-nMaHJawSsyu5uHRWbDR1bnwapLmOJUnB-s9QO1YY7_u7EheEUuHoeB5Ok84Q_UTh6LPiEv5U4C-4QNH5yuBHSAA&session_state=b7dc0d8d-217a-4354-8cfc-aeb0edfba4c5 HTTP/1.1" 200 -
200
{"token_type":"Bearer","scope":"MyFiles.Read MyFiles.Write","expires_in":"3599","expires_on":"1465592111","not_before":"1465588211","resource":"https://cnpx-my.sharepoint.com/","access_token":"eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6Ik1uQ19WWmNBVGZNNXBPWWlKSE1iYTlnb0VLWSIsImtpZCI6Ik1uQ19WWmNBVGZNNXBPWWlKSE1iYTlnb0VLWSJ9.eyJhdWQiOiJodHRwczovL2NucHgtbXkuc2hhcmVwb2ludC5jb20vIiwiaXNzIjoiaHR0cHM6Ly9zdHMud2luZG93cy5uZXQvM2M4Y2I4MmUtNGVjOS00ZTA3LTgzNTctZTI4ZjFkNDczOGRhLyIsImlhdCI6MTQ2NTU4ODIxMSwibmJmIjoxNDY1NTg4MjExLCJleHAiOjE0NjU1OTIxMTEsImFjciI6IjEiLCJhbXIiOlsicHdkIl0sImFwcGlkIjoiYTUyZmM3MWItOWQ4OC00NTQ0LTk4YmMtMDFiOTA2ZjM2OGQ2IiwiYXBwaWRhY3IiOiIxIiwiZmFtaWx5X25hbWUiOiJNYXNzb24iLCJnaXZlbl9uYW1lIjoiRGFuaWVsIiwiaXBhZGRyIjoiMTkwLjYwLjIwOC4xMzQiLCJuYW1lIjoiRGFuaWVsIE1hc3NvbiIsIm9pZCI6IjA3YWFlYTM1LWE2MjUtNDJhNS1hODk0LTBlNjU3MDU0ZThkOSIsInB1aWQiOiIxMDAzQkZGRDk1OTcxMTJCIiwic2NwIjoiTXlGaWxlcy5SZWFkIE15RmlsZXMuV3JpdGUiLCJzdWIiOiJqX2pva3ZYZU9naDN4NGhxYXl5WkVUZFkxbzR6MmRfM2VIcl9ud2FGZVJVIiwidGlkIjoiM2M4Y2I4MmUtNGVjOS00ZTA3LTgzNTctZTI4ZjFkNDczOGRhIiwidW5pcXVlX25hbWUiOiJkYW5pZWwubWFzc29uQGNucHgub25taWNyb3NvZnQuY29tIiwidXBuIjoiZGFuaWVsLm1hc3NvbkBjbnB4Lm9ubWljcm9zb2Z0LmNvbSIsInZlciI6IjEuMCJ9.Cf1_GQQUoCYAYc5Ajebw7k2FVWAC1aVQahXgnM2qDIGF-GaxCjgZO5lujzQ3fVKHOC9_6Y-pp2VEsUC5QdIM2V-ukwDNrl_6d9MB0Eyd6E5uskSCjyxe83tz0lW7IRysQ1hL4CCzSoVn2oJNjgMEOOTGOwpOK_kiD9UNTqKZgGSaBwIO3TkdWWHXiML2VDjJFAK9GYlafeYek8znV8KxicZnmZ6aCa4LQ1OjLR4Do818iWVTNZRdoAjFu26BPswJAqzgWhjkZjq2EADSGjU6Pp8-9PmiKTKp-M0hWHdbDPLgghHZ5Gr_ZCnPHAgWtoh5VWE0lZ0853vaX08C2LQp-A","refresh_token":"AAABAAAAiL9Kn2Z27UubvWFPbm0gLeytWMaSzOYR4pVYjm-Ue6KaAKClsejUaDO7qkJX4rY4bN77Nt6OY3EYZgJwUYI63r5xxMvPSk6Z7o5hajIyZnsRN1_32yet1jfQJqR6RYSnqBOAkcnEtkmfyqAC2bNfzKRvTIs0k-huZRRKtCK9o-WtFnNZ31wlsKsKKoj7jXlM3QnRSs9SnXcZTgCxCryoV0tl2mhDtFMiRyV727Y_mDvQLKA7XNJ-dKoWMRs1_xhJh0AQoqSsJMSA_z6ySaY6cAQxagiaemgDoAqmSAG9KwxLUN91zNdiIUmYWkLb90e1vwhkABb-4g6MgfAZ33_Ccszagq-zDVYywJng-6GcoLOeGmV3jDFJiuRCJswryH0O-jebTck8DmybqIfIgyFZmaAKSv39Q1JQU6vJ2YeYLFnFPZ3fTKMYHg7tHlL8g0Qvm0jaF4vcZbdY3_Y7v3XVmXpwCcvNuEpfERDuFYLLaCx-WbXC_N7LDbGoUz3dhMEKEyhwynjJ4aOX1CZoWbWUjLNDUt-pX3c9PjCrwV5b4qMbmdA83HHBNQmI2I1vvfn2YMiAxCB91IW2vfpDr30COG-UoH3enpug_wBCUFIdKNbV8tvasVxtwb351v4G0oWu9TNjHWnhhDpMINJpVsHS_bwlgCr149qoH4pU8e5mjWOnV_zLM2CNn2JQGdaFHbHTIAA","id_token":"eyJ0eXAiOiJKV1QiLCJhbGciOiJub25lIn0.eyJhdWQiOiJhNTJmYzcxYi05ZDg4LTQ1NDQtOThiYy0wMWI5MDZmMzY4ZDYiLCJpc3MiOiJodHRwczovL3N0cy53aW5kb3dzLm5ldC8zYzhjYjgyZS00ZWM5LTRlMDctODM1Ny1lMjhmMWQ0NzM4ZGEvIiwiaWF0IjoxNDY1NTg4MjEyLCJuYmYiOjE0NjU1ODgyMTIsImV4cCI6MTQ2NTU5MjExMiwiYW1yIjpbInB3ZCJdLCJmYW1pbHlfbmFtZSI6Ik1hc3NvbiIsImdpdmVuX25hbWUiOiJEYW5pZWwiLCJpcGFkZHIiOiIxOTAuNjAuMjA4LjEzNCIsIm5hbWUiOiJEYW5pZWwgTWFzc29uIiwib2lkIjoiMDdhYWVhMzUtYTYyNS00MmE1LWE4OTQtMGU2NTcwNTRlOGQ5Iiwic3ViIjoiYWFHZXVSWWJJdlRJNTlFUDJqMTdya2tfRElpbWZILTllcHdXREtDV2RVdyIsInRpZCI6IjNjOGNiODJlLTRlYzktNGUwNy04MzU3LWUyOGYxZDQ3MzhkYSIsInVuaXF1ZV9uYW1lIjoiZGFuaWVsLm1hc3NvbkBjbnB4Lm9ubWljcm9zb2Z0LmNvbSIsInVwbiI6ImRhbmllbC5tYXNzb25AY25weC5vbm1pY3Jvc29mdC5jb20iLCJ2ZXIiOiIxLjAifQ."}

What do you think ?

BTW, thanks for your quick reply !

@dmasson
Copy link
Contributor

dmasson commented Jun 10, 2016

UPDATE: I kept the workaround above, and managed to upload a file to my OneDrive business account by hardcoding the API endpoint URL in extensions/onedrivesdk_helper.py at the return statement as follows:

return OneDriveClient("https://cnpx-my.sharepoint.com/_api/v2.0/",
                          auth_provider,
                          http_provider)

So, it's running, I guess I need clean solution instead of hardcoding

UPDATE: @ilmaisin is not using the default client, thats the clean way

@cdmayer
Copy link
Contributor

cdmayer commented Jun 10, 2016

Not sure if you already figured this out, but you shouldn't be using get_default_client(). That method is targeted at signing into a Microsoft account (instead of Azure AD). Try something like this:

http_provider = HttpProvider()
auth_provider = AuthProvider(http_provider, client_id, [])
client = OneDriveClient("your_url", auth_provider, http_provider)

@dmasson
Copy link
Contributor

dmasson commented Jun 10, 2016

yes I figured it out, too late !, thanks !

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants