public async Task <string> GetFileAsync()
            {
                var request = WebRequest.CreateHttp($"https://www.googleapis.com/drive/v2/files/{fileId}");

                request.Headers["Authorization"] = "Bearer " + (await Drive.GetAccessTokenAsync());
                request.Method = "GET";
                using (var response = await GetHttpResponseAsync(request))
                {
                    if (response == null)
                    {
                        MyLogger.Log("Null response");
                        return(null);
                    }
                    //MyLogger.Log($"Http response: {response.StatusCode} ({(int)response.StatusCode})");
                    if (response.StatusCode == HttpStatusCode.OK)
                    {
                        return(await LogHttpWebResponse(response, true));
                    }
                    else
                    {
                        MyLogger.Log("Http response isn't OK!");
                        MyLogger.Log(await LogHttpWebResponse(response, true));
                        return(null);
                    }
                }
            }
 private async Task StartPrivate()
 {
     Status = FileCreatorStatus.Creating;
     MessageAppended?.Invoke("Creating Folder...");
     string json = $"{{\"name\":\"{name}\",\"parents\":[\"{cloudId}\"]";
     if(isFolder)
     {
         json += ",\"mimeType\": \"application/vnd.google-apps.folder\"";
     }
     json += "}";
     MessageAppended?.Invoke(json);
     HttpWebRequest request = WebRequest.CreateHttp("https://www.googleapis.com/drive/v3/files");
     var bytes = Encoding.UTF8.GetBytes(json);
     request.Headers["Content-Type"] = "application /json; charset=UTF-8";
     request.Headers["Content-Length"] = bytes.Length.ToString();
     request.Headers["Authorization"] = "Bearer " + (await Drive.GetAccessTokenAsync());
     request.Method = "POST";
     using (System.IO.Stream requestStream = await request.GetRequestStreamAsync())
     {
         await requestStream.WriteAsync(bytes, 0, bytes.Length);
     }
     using (var response = await GetHttpResponseAsync(request))
     {
         if (response == null)
         {
             MessageAppended?.Invoke("Null response");
             Status = FileCreatorStatus.ErrorNeedRestart;
             return;
         }
         MessageAppended?.Invoke($"Http response: {response.StatusCode} ({(int)response.StatusCode})");
         if (response.StatusCode == HttpStatusCode.OK)
         {
             using (var reader = new System.IO.StreamReader(response.GetResponseStream()))
             {
                 var jsonObj = JsonConvert.DeserializeObject<Dictionary<string, string>>(await reader.ReadToEndAsync());
                 if (!jsonObj.ContainsKey("id"))
                 {
                     MessageAppended?.Invoke("response.Headers doesn't contain a key for \"id\"!");
                     MessageAppended?.Invoke(await LogHttpWebResponse(response, true));
                     Status = FileCreatorStatus.ErrorNeedRestart;
                     return;
                 }
                 Result= jsonObj["id"];
                 MessageAppended?.Invoke($"Folder {name} ({Result}) created!");
                 Status = FileCreatorStatus.Completed;
                 return;
             }
         }
         else
         {
             MessageAppended?.Invoke("Http response isn't OK!");
             MessageAppended?.Invoke(await LogHttpWebResponse(response, true));
             Status = FileCreatorStatus.ErrorNeedRestart;
             return;
         }
     }
 }
示例#3
0
            private async Task <bool> CreateResumableDownloadAsync()
            {
                indexRetry :;
                if (serverStream != null)
                {
                    serverStream.Dispose();
                    serverStream = null;
                }
                var request = WebRequest.CreateHttp(resumableUri);

                request.Headers["Authorization"] = "Bearer " + (await Drive.GetAccessTokenAsync());
                request.Headers["Range"]         = $"bytes={bytesReceivedSoFar}-";
                request.Method = "GET";
                var response = await GetHttpResponseAsync(request);

                if (response == null)
                {
                    MyLogger.Log("Null response, trying to create the download again...");
                    goto indexRetry;
                }
                else if (response.StatusCode == HttpStatusCode.PartialContent)
                {
                    serverStream = response.GetResponseStream();
                    if (Array.IndexOf(response.Headers.AllKeys, "content-length") == -1)
                    {
                        MyLogger.Log($"Response header doesn't exist: content-length");
                        MyLogger.Log(await LogHttpWebResponse(response, true));
                        return(false);
                    }
                    if (!long.TryParse(response.Headers["content-length"], out serverStreamLength))
                    {
                        MyLogger.Log($"Error parsing serverStreamLength from \"content-length\" header: {response.Headers["content-length"]}");
                        MyLogger.Log(await LogHttpWebResponse(response, true));
                        return(false);
                    }
                    return(true);
                }
                else
                {
                    MyLogger.Log("Http response isn't PartialContent!");
                    MyLogger.Log(await LogHttpWebResponse(response, true));
                    return(false);
                }
            }
            public async Task GetNextPageAsync(string fields = "nextPageToken,incompleteSearch,files(id,name,mimeType)")
            {
                string url = $"https://www.googleapis.com/drive/v3/files?corpora=user&fields={fields}";

                url += $"&pageSize={pageSize}";
                if (pageToken != null)
                {
                    url += $"&pageToken={pageToken}";
                }
                url += $"&q={System.Net.WebUtility.UrlEncode(searchPattern)}";
                HttpWebRequest request = WebRequest.CreateHttp(url);

                //MessageAppended?.Invoke($"url: {url}");
                request.Headers["Authorization"] = "Bearer " + (await Drive.GetAccessTokenAsync());
                request.Method = "GET";
                using (var response = await GetHttpResponseAsync(request))
                {
                    if (response == null)
                    {
                        MessageAppended?.Invoke("Null response");
                        Status = SearchStatus.ErrorNeedResume;
                        return;
                    }
                    MessageAppended?.Invoke($"Http response: {response.StatusCode} ({(int)response.StatusCode})");
                    if (response.StatusCode == HttpStatusCode.OK)
                    {
                        string resultText;
                        using (var responseStream = response.GetResponseStream())
                        {
                            using (var reader = new System.IO.StreamReader(responseStream))
                            {
                                resultText = await reader.ReadToEndAsync();
                            }
                        }
                        NextPageString = resultText;
                        var result = JsonConvert.DeserializeObject <temporaryClassForResponseBody>(resultText);
                        if (result.incompleteSearch)
                        {
                            MessageAppended?.Invoke("Warning! This is an Incomplete Search");
                            MyLogger.Log("Warning! This is an Incomplete Search");
                        }
                        FileListGot.Clear();
                        if (result.files != null)
                        {
                            foreach (var file in result.files)
                            {
                                FileListGot.Add(new Tuple <string, string, string>(file.id, file.name, file.mimeType));
                            }
                        }
                        NewFileListGot?.Invoke(FileListGot);
                        if (result.nextPageToken == null)
                        {
                            Status = SearchStatus.Completed;
                        }
                        else
                        {
                            pageToken = result.nextPageToken;
                            Status    = SearchStatus.Paused;
                        }
                        return;
                    }
                    else
                    {
                        MessageAppended?.Invoke("Http response isn't OK!");
                        MessageAppended?.Invoke(await LogHttpWebResponse(response, true));
                        Status = SearchStatus.ErrorNeedResume;
                        return;
                    }
                }
            }
示例#5
0
 private async Task DoMultipartUploadAsync()
 {
     Status = UploadStatus.Uploading;
     OnProgressChanged(0, fileStream.Length);
     CloudFile.Networker.OnTotalAmountRemainChanged(fileStream.Length);
     try
     {
         var body = MergeMetadataAndFileContent(new Func <byte[]>(() =>
         {
             string json = $"Content-Type: application/json; charset=UTF-8\n\n{{\"name\":\"{fileName}\"";
             if (parents.Count > 0)
             {
                 json += ",\"parents\":[";
                 foreach (string parent in parents)
                 {
                     json += $"\"{parent}\",";
                 }
                 json = json.Remove(json.Length - 1) + "]";
             }
             json += "}";
             MessageAppended?.Invoke(json);
             return(Encoding.UTF8.GetBytes(json));
         })(), await new Func <Task <byte[]> >(async() =>
         {
             byte[] buffer = new byte[fileStream.Length];
             for (int i = 0; i < buffer.Length;)
             {
                 i += await fileStream.ReadAsync(buffer, i, buffer.Length - i);
             }
             return(buffer);
         })());
         //MessageAppended?.Invoke($"Request to send:\r\n{Encoding.UTF8.GetString(body.Item2)}");
         //long totalBytes = fileStream.Length;
         HttpWebRequest request = WebRequest.CreateHttp("https://www.googleapis.com/upload/drive/v3/files?uploadType=multipart");
         request.Headers["Content-Type"]   = "multipart/related; charset=UTF-8; boundary=" + body.Item1;
         request.Headers["Content-Length"] = body.Item2.Length.ToString(); // Convert.FromBase64String(json).Length.ToString();
                                                                           //request.Headers["X-Upload-Content-Type"]= Constants.GetMimeType(System.IO.Path.GetExtension(filePath));
                                                                           //request.Headers["X-Upload-Content-Length"] = totalBytes.ToString();
         request.Headers["Authorization"] = "Bearer " + (await Drive.GetAccessTokenAsync());
         request.Method = "POST";
         using (System.IO.Stream requestStream = await request.GetRequestStreamAsync())
         {
             await requestStream.WriteAsync(body.Item2, 0, body.Item2.Length);
         }
         using (var response = await GetHttpResponseAsync(request))
         {
             if (response == null)
             {
                 MessageAppended?.Invoke("Null response");
                 Status = UploadStatus.ErrorNeedRestart;
                 return;
             }
             MessageAppended?.Invoke($"Http response: {response.StatusCode} ({(int)response.StatusCode})");
             if (response.StatusCode == HttpStatusCode.OK)
             {
                 OnProgressChanged(fileStream.Length, fileStream.Length);
                 OnChunkSent(fileStream.Length);
                 Status = UploadStatus.Completed;
                 return;
             }
             else
             {
                 MessageAppended?.Invoke("Http response isn't OK!");
                 MessageAppended?.Invoke(await LogHttpWebResponse(response, true));
                 Status = UploadStatus.ErrorNeedRestart;
                 return;
             }
         }
     }
     finally
     {
         CloudFile.Networker.OnTotalAmountRemainChanged(-fileStream.Length);
     }
 }
示例#6
0
            private async Task CreateResumableUploadAsync()
            {
                Status = UploadStatus.Creating;
                string json = $"{{\"name\":\"{fileName}\"";

                if (parents.Count > 0)
                {
                    json += ",\"parents\":[";
                    foreach (string parent in parents)
                    {
                        json += $"\"{parent}\",";
                    }
                    json = json.Remove(json.Length - 1) + "]";
                }
                json += "}";
                MessageAppended?.Invoke(json);
                long           totalBytes = fileStream.Length;
                HttpWebRequest request    = WebRequest.CreateHttp("https://www.googleapis.com/upload/drive/v3/files?uploadType=resumable");
                var            bytes      = Encoding.UTF8.GetBytes(json);

                request.Headers["Content-Type"]   = "application /json; charset=UTF-8";
                request.Headers["Content-Length"] = bytes.Length.ToString(); // Convert.FromBase64String(json).Length.ToString();
                //request.Headers["X-Upload-Content-Type"]= Constants.GetMimeType(System.IO.Path.GetExtension(filePath));
                request.Headers["X-Upload-Content-Length"] = totalBytes.ToString();
                request.Headers["Authorization"]           = "Bearer " + (await Drive.GetAccessTokenAsync());
                request.Method = "POST";
                using (System.IO.Stream requestStream = await request.GetRequestStreamAsync())
                {
                    await requestStream.WriteAsync(bytes, 0, bytes.Length);

                    //using (System.IO.StreamWriter streamWriter = new System.IO.StreamWriter(requestStream))
                    //{
                    //    await streamWriter.WriteAsync(json);
                    //}
                }
                using (var response = await GetHttpResponseAsync(request))
                {
                    if (response == null)
                    {
                        MessageAppended?.Invoke("Null response");
                        Status = UploadStatus.ErrorNeedRestart;
                        return;
                    }
                    MessageAppended?.Invoke($"Http response: {response.StatusCode} ({(int)response.StatusCode})");
                    if (response.StatusCode == HttpStatusCode.OK)
                    {
                        if (Array.IndexOf(response.Headers.AllKeys, "location") == -1)
                        {
                            MessageAppended?.Invoke("response.Headers doesn't contain a key for \"location\"!");
                            Status = UploadStatus.ErrorNeedRestart;
                            return;
                        }
                        var resumableUri = JsonConvert.SerializeObject(response.Headers["location"]);
                        MessageAppended?.Invoke($"Resumable Uri: {resumableUri}");
                        this.resumableUri = resumableUri;
                        Status            = UploadStatus.Created;
                        return;
                    }
                    else
                    {
                        MessageAppended?.Invoke("Http response isn't OK!");
                        MessageAppended?.Invoke(await LogHttpWebResponse(response, true));
                        Status = UploadStatus.ErrorNeedRestart;
                        return;
                    }
                }
            }