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; } } }
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; } } }
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); } }
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; } } }