public override void StartHandleRequestBody(Stream outputStream, EndRequestBody endRequestBody)
        {
            RequestBodyState requestBodyState = new RequestBodyState();

            requestBodyState.endRequestBody = endRequestBody;
            requestBodyState.outputStream   = outputStream;
            requestBodyState.buffer         = data;
            int count = (int)(contentLength > SEGMENT_SIZE ? SEGMENT_SIZE : contentLength);

            try
            {
                requestBodyState.complete = count;
                outputStream.BeginWrite(requestBodyState.buffer, 0, count, AsyncStreamCallback, requestBodyState);
            }
            catch (Exception ex)
            {
                if (outputStream != null)
                {
                    outputStream.Close();
                }
                QLog.E(TAG, ex.Message, ex);
                requestBodyState.endRequestBody(ex);
                requestBodyState = null;
            }
        }
        public override void StartHandleRequestBody(Stream outputStream, EndRequestBody endRequestBody = null)
        {
            try
            {
                int completed = 0;

                while (completed + SEGMENT_SIZE < contentLength)
                {
                    outputStream.Write(data, completed, SEGMENT_SIZE);
                    outputStream.Flush();
                    completed += SEGMENT_SIZE;

                    if (progressCallback != null)
                    {
                        UpdateProgress(completed, contentLength);
                    }
                }

                if (completed < contentLength)
                {
                    //包括本身
                    //包括本身
                    outputStream.Write(data, completed, (int)(contentLength - completed));
                    outputStream.Flush();

                    if (progressCallback != null)
                    {
                        UpdateProgress(contentLength, contentLength);
                    }
                }

                if (endRequestBody != null)
                {
                    endRequestBody(null);
                }
            }
            catch (Exception ex)
            {
                if (endRequestBody != null)
                {
                    endRequestBody(ex);
                }
                else
                {
                    throw;
                }
            }
            finally
            {
                if (outputStream != null)
                {
                    outputStream.Flush();
                    outputStream.Close();
                    outputStream.Dispose();
                    //QLog.D("XIAO", "stream close");
                    outputStream = null;
                }
            }
        }
        public override void StartHandleRequestBody(Stream outputStream, EndRequestBody endRequestBody)
        {
            RequestBodyState requestBodyState = new RequestBodyState();

            requestBodyState.endRequestBody = endRequestBody;
            requestBodyState.outputStream   = outputStream;
            requestBodyState.complete       = 0;
            int size = (int)(contentLength > SEGMENT_SIZE ? SEGMENT_SIZE : contentLength);

            fileStream = new FileStream(srcPath, FileMode.Open, FileAccess.Read);
            fileStream.Seek(fileOffset, SeekOrigin.Begin);
            try
            {
                requestBodyState.buffer = new byte[size];// 4kb
                long remain = contentLength - requestBodyState.complete;
                if (remain > 0)
                {
                    int count = fileStream.Read(requestBodyState.buffer, 0, (int)(requestBodyState.buffer.Length > remain ? remain : requestBodyState.buffer.Length));
                    requestBodyState.complete = count;
                    outputStream.BeginWrite(requestBodyState.buffer, 0, count, AsyncStreamCallback, requestBodyState);
                }
                else
                {
                    if (fileStream != null)
                    {
                        fileStream.Close();
                    }
                    if (outputStream != null)
                    {
                        outputStream.Close();
                    }
                    //write over
                    requestBodyState.endRequestBody(null);
                    requestBodyState = null;
                }
            }
            catch (Exception ex)
            {
                if (fileStream != null)
                {
                    fileStream.Close();
                }
                if (outputStream != null)
                {
                    outputStream.Close();
                }
                QLog.E(TAG, ex.Message, ex);
                requestBodyState.endRequestBody(ex);
                requestBodyState = null;
            }
        }
        public virtual void EndRequest(ulong hash, int requestNumber, int appStatus)
        {
            if (debugEnabled)
            {
                Logger.Write(LogLevel.Debug, "lt={0:X} EndRequest reqN={1}", hash, requestNumber);
            }
            TransportRequest req = GetRequest(hash);

            if (req != null && req.RequestNumber == requestNumber)
            {
                RemoveRequest(req.Hash);
                EndRequestBody body = new EndRequestBody(appStatus, ProtocolStatus.RequestComplete);

                byte[] bodyData = body.GetData();

                SendRecord(req.fd, RecordType.EndRequest, req.RequestId,
                           bodyData, 0, bodyData.Length);
            }
            else
            {
                Logger.Write(LogLevel.Error, "Wrong EndRequest");
            }
        }
Exemple #5
0
        public override void StartHandleRequestBody(Stream outputStream, EndRequestBody endRequestBody)
        {
            requestBodyState = new RequestBodyState();
            requestBodyState.endRequestBody = endRequestBody;
            requestBodyState.outputStream   = outputStream;
            requestBodyState.complete       = 0;

            //write paramters
            WriteParameters(outputStream);

            //写入content-disposition: form-data; name = "file"; filename = "xxx"\r\n
            WriteFileParameters(outputStream);

            outputStream.Flush();


            int size = (int)(realContentLength > SEGMENT_SIZE ? SEGMENT_SIZE : realContentLength);

            if (srcPath != null)
            {
                try
                {
                    fileStream = new FileStream(srcPath, FileMode.Open, FileAccess.Read);
                    fileStream.Seek(fileOffset, SeekOrigin.Begin);
                    requestBodyState.buffer = new byte[size];// 4kb
                    long remain = realContentLength - requestBodyState.complete;
                    if (remain > 0)
                    {
                        int count = fileStream.Read(requestBodyState.buffer, 0, (int)(requestBodyState.buffer.Length > remain ? remain : requestBodyState.buffer.Length));
                        requestBodyState.complete = count;
                        outputStream.BeginWrite(requestBodyState.buffer, 0, count, AsyncStreamCallback, requestBodyState);
                    }
                    else
                    {
                        if (fileStream != null)
                        {
                            fileStream.Close();
                        }
                        WriteEndLine(outputStream);
                        outputStream.Flush();
                        //write over
                        requestBodyState.endRequestBody(null);
                    }
                }
                catch (Exception ex)
                {
                    if (fileStream != null)
                    {
                        fileStream.Close();
                    }
                    QLog.E(TAG, ex.Message, ex);
                    requestBodyState.endRequestBody(ex);
                }
            }
            else if (data != null)
            {
                requestBodyState.buffer = data;
                try
                {
                    requestBodyState.complete = size;
                    outputStream.BeginWrite(requestBodyState.buffer, 0, size, AsyncStreamCallback, requestBodyState);
                }
                catch (Exception ex)
                {
                    QLog.E(TAG, ex.Message, ex);
                    requestBodyState.endRequestBody(ex);
                }
            }
        }
Exemple #6
0
 /// <summary>
 /// Asynchronous method: handle request body
 /// </summary>
 /// <param name="outputStream"></param>
 /// <param name="EndRequestBody"></param>
 public abstract void StartHandleRequestBody(Stream outputStream, EndRequestBody endRequestBody);
        public override void StartHandleRequestBody(Stream outputStream, EndRequestBody endRequestBody)
        {
            //write paramters
            WriteParameters(outputStream);

            //写入content-disposition: form-data; name = "file"; filename = "xxx"\r\n
            WriteFileParameters(outputStream);

            outputStream.Flush();

            //wrtie content: file or bintary
            try
            {
                if (data != null)
                {
                    int completed = 0;
                    while (completed + SEGMENT_SIZE < realContentLength)
                    {
                        outputStream.Write(data, completed, SEGMENT_SIZE);
                        outputStream.Flush();
                        completed += SEGMENT_SIZE;
                        if (progressCallback != null)
                        {
                            UpdateProgress(completed, realContentLength);
                        }
                    }

                    if (completed < realContentLength)
                    {
                        outputStream.Write(data, completed, (int)(realContentLength - completed));//包括本身
                        if (progressCallback != null)
                        {
                            UpdateProgress(realContentLength, realContentLength);
                        }
                    }

                    WriteEndLine(outputStream);
                    outputStream.Flush();
                }
                else if (srcPath != null)
                {
                    byte[] buffer    = new byte[SEGMENT_SIZE]; // 64kb
                    int    bytesRead = 0;
                    long   completed = bytesRead;
                    fileStream = new FileStream(srcPath, FileMode.Open, FileAccess.Read);
                    fileStream.Seek(fileOffset, SeekOrigin.Begin);
                    long remain = realContentLength - completed;
                    if (remain > 0)
                    {
                        while ((bytesRead = fileStream.Read(buffer, 0, (int)(buffer.Length > remain ? remain : buffer.Length))) != 0)
                        {
                            outputStream.Write(buffer, 0, bytesRead);
                            outputStream.Flush();
                            completed += bytesRead;
                            if (progressCallback != null)
                            {
                                UpdateProgress(completed, realContentLength);
                            }
                            remain = realContentLength - completed;
                            if (remain == 0)
                            {
                                break;
                            }
                        }
                    }
                    else
                    {
                        if (progressCallback != null)
                        {
                            completed += bytesRead;
                            UpdateProgress(completed, realContentLength);
                        }
                    }

                    WriteEndLine(outputStream);
                    outputStream.Flush();
                }

                endRequestBody(null);
            }
            catch (Exception ex)
            {
                endRequestBody(ex);
            }
            finally
            {
                if (fileStream != null)
                {
                    fileStream.Close();
                    fileStream.Dispose();
                    //QLog.D("XIAO", "stream close");
                    fileStream = null;
                }
                if (outputStream != null)
                {
                    outputStream.Flush();
                    outputStream.Close();
                    outputStream.Dispose();
                    //QLog.D("XIAO", "stream close");
                    outputStream = null;
                }
            }
        }
        public override void StartHandleRequestBody(Stream outputStream, EndRequestBody endRequestBody)
        {
            FileStream fileStream = null;

            try
            {
                byte[] buffer    = new byte[SEGMENT_SIZE];
                int    bytesRead = 0;
                long   completed = bytesRead;
                fileStream = new FileStream(srcPath, FileMode.Open, FileAccess.Read);
                fileStream.Seek(fileOffset, SeekOrigin.Begin);//seek to designated position
                long remain = contentLength - completed;
                if (remain > 0)
                {
                    while ((bytesRead = fileStream.Read(buffer, 0, (int)(buffer.Length > remain ? remain : buffer.Length))) != 0)
                    {
                        outputStream.Write(buffer, 0, bytesRead);
                        outputStream.Flush();
                        completed += bytesRead;
                        if (progressCallback != null)
                        {
                            UpdateProgress(completed, contentLength);
                        }
                        remain = contentLength - completed;
                        if (remain == 0)
                        {
                            break;
                        }
                    }
                }
                else
                {
                    if (progressCallback != null)
                    {
                        UpdateProgress(completed, contentLength);
                    }
                }

                buffer = null;
                endRequestBody(null);
            }
            catch (Exception ex)
            {
                QLog.E(TAG, ex.Message, ex);
                endRequestBody(ex);
            }
            finally
            {
                if (fileStream != null)
                {
                    fileStream.Close();
                    fileStream.Dispose();
                    //QLog.D("XIAO", "stream close");
                    fileStream = null;
                }
                if (outputStream != null)
                {
                    outputStream.Flush();
                    outputStream.Close();
                    outputStream.Dispose();
                    //QLog.D("XIAO", "stream close");
                    outputStream = null;
                }
            }
        }
        public override void StartHandleRequestBody(Stream outputStream, EndRequestBody endRequestBody = null)
        {
            try
            {
                byte[] buffer    = new byte[SEGMENT_SIZE];
                int    bytesRead = 0;

                long completed = bytesRead;
                //seek to designated position
                //seek to designated position
                stream.Seek(fileOffset, SeekOrigin.Begin);
                long remain = contentLength - completed;

                if (remain > 0)
                {
                    while ((bytesRead = stream.Read(buffer, 0, (int)(buffer.Length > remain ? remain : buffer.Length))) != 0)
                    {
                        outputStream.Write(buffer, 0, bytesRead);
                        outputStream.Flush();
                        completed += bytesRead;

                        if (progressCallback != null)
                        {
                            UpdateProgress(completed, contentLength);
                        }

                        remain = contentLength - completed;

                        if (remain == 0)
                        {
                            break;
                        }
                    }
                }
                else
                {
                    if (progressCallback != null)
                    {
                        UpdateProgress(completed, contentLength);
                    }
                }

                buffer = null;
                if (endRequestBody != null)
                {
                    endRequestBody(null);
                }
            }
            catch (Exception ex)
            {
                if (endRequestBody != null)
                {
                    endRequestBody(ex);
                }
                else
                {
                    throw;
                }
            }
            finally
            {
                if (outputStream != null)
                {
                    outputStream.Flush();
                    outputStream.Close();
                    outputStream.Dispose();
                    //QLog.D("XIAO", "stream close");
                    outputStream = null;
                }
            }
        }