public async Task<SynchronizationReport> PushChangesAsync(CancellationToken token)
		{
			token.Register(() => { });//request.Abort() TODO: check this

			token.ThrowIfCancellationRequested();

			if (sourceStream.CanRead == false)
				throw new Exception("Stream does not support reading");

            var commands = (IAsyncFilesCommandsImpl)this.destination.Commands;

            var baseUrl = commands.UrlFor();
            var credentials = commands.PrimaryCredentials;
            var conventions = commands.Conventions;

            request = commands.RequestFactory.CreateHttpJsonRequest(
                                    new CreateHttpJsonRequestParams(this, baseUrl + "/synchronization/MultipartProceed",
                                                                    "POST", credentials, conventions));

            // REVIEW: (Oren) There is a mismatch of expectations in the AddHeaders. ETag must always have to be surrounded by quotes. 
            //         If AddHeader/s ever put an etag it should check for that.
            //         I was hesitant to do the change though, because I do not understand the complete scope of such a change.
            request.AddHeaders(sourceMetadata);           
			request.AddHeader("Content-Type", "multipart/form-data; boundary=" + syncingBoundary);

			request.AddHeader(SyncingMultipartConstants.FileName, fileName);
			request.AddHeader(SyncingMultipartConstants.SourceServerInfo, serverInfo.AsJson());

			try
			{
				await request.WriteAsync(PrepareMultipartContent(token));

				var response = await request.ReadResponseJsonAsync();
				return new JsonSerializer().Deserialize<SynchronizationReport>(new RavenJTokenReader(response));
			}
			catch (Exception exception)
			{
				if (token.IsCancellationRequested)
				{
					throw new OperationCanceledException(token);
				}

				var webException = exception as ErrorResponseException;

				if (webException != null)
				{
					webException.SimplifyException();
				}

				throw;
			}
		}
		public async Task<SynchronizationReport> PushChangesAsync(CancellationToken token)
		{
			token.Register(() => { });//request.Abort() TODO: check this

			token.ThrowIfCancellationRequested();

			if (sourceStream.CanRead == false)
			{
				throw new Exception("Stream does not support reading");
			}

			request =
				destination.JsonRequestFactory.CreateHttpJsonRequest(new CreateHttpJsonRequestParams(this,
					destination.FileSystemUrl + "/synchronization/MultipartProceed",
					"POST", destination.Credentials, destination.Convention));

			//request.SendChunked = true;
			//request.AllowWriteStreamBuffering = false;
			//request.KeepAlive = true;

			request.AddHeaders(sourceMetadata);

			request.AddHeader("Content-Type", "multipart/form-data; boundary=" + syncingBoundary);

			request.AddHeader(SyncingMultipartConstants.FileName, fileName);
			request.AddHeader(SyncingMultipartConstants.SourceServerInfo, serverInfo.AsJson());

			try
			{
				await request.WriteAsync(PrepareMultipartContent(token));

				var response = await request.ReadResponseJsonAsync();
				return new JsonSerializer().Deserialize<SynchronizationReport>(new RavenJTokenReader(response));
			}
			catch (Exception exception)
			{
				if (token.IsCancellationRequested)
				{
					throw new OperationCanceledException(token);
				}

				var webException = exception as ErrorResponseException;

				if (webException != null)
				{
					webException.BetterWebExceptionError();
				}

				throw;
			}
		}
 internal static void AddEtagHeader(HttpJsonRequest request, Etag etag)
 {
     if (etag != null)
     {
         request.AddHeader("If-None-Match", "\"" + etag + "\"");
     }
 }