Beispiel #1
0
        public override void Timeout(UniNetObject connection, object Addition)
        {
            HTTPStateObject state = Addition as HTTPStateObject;

            log("id:" + state?.request.id, ERROR, "HTTP.Received");
            log("timeout:" + connection.CompleteTime, ERROR, "HTTP.Received");
            log("connection info:" + state?.Length, ERROR, "HTTP.Received");
        }
Beispiel #2
0
 private static HTTPRequest ProcessResponse(HTTPResponse response, HTTPStateObject state)
 {
     state.request.Done = true;
     response.request   = state.request;
     if (response.bodyBytesLength == 0)
     {
         response.bodyBytesLength = Encoding.UTF8.GetByteCount(response.body);
     }
     return(state.request.Callback(response));
 }
Beispiel #3
0
        public override void Aborted(UniNetObject connection, object Addition)
        {
            HTTPStateObject state = Addition as HTTPStateObject;

            if (state == null)
            {
                return;
            }
            if (state.request.Done == false)
            {
                HTTPOp.Request(state.request);
            }
        }
Beispiel #4
0
        public static HTTPError Request(HTTPMethod method, string Url, object Addition, HTTPRequest.RequestCallback callback, HTTPCookie cookie = null, HTTPHeader additionHeader = null, string PostData = null)
        {
            HTTPStateObject state   = new HTTPStateObject();
            HTTPRequest     request = new HTTPRequest()
            {
                method = method
            };
            Uri path = new Uri(Url);

            request.Cookie   = cookie?.GetCookie(path.Host);
            request.Header   = additionHeader;
            request.Callback = callback;
            request.Addition = Addition;
            request.SetUrl(path.Scheme, path.PathAndQuery, path.Host);
            request.PostData = PostData;
            return(Request(request));
        }
Beispiel #5
0
        override public object Connected(UniNetObject connection, out NetCore.Error.NetCoreException err)
        {
            err = null;
            HTTPRequest request = null;

            if (ConnectedRequest != null)
            {
                request = ConnectedRequest;
                connection.Write(ConnectedRequest.ToByte(), out err);
                ConnectedRequest = null;
            }
            lock (newConnectLock)
            {
                Monitor.Pulse(newConnectLock);
            }
            var state = new HTTPStateObject()
            {
                request = request
            };

            return(state);
        }
Beispiel #6
0
        public object ProcessHTTPResponse(byte[] data, HTTPStateObject state, out HTTPRequest request)
        {
            //string dataAsString = Encoding.UTF8.GetString(data);
            if (state == null)
            {
                throw new InvalidOperationException();
            }
            try
            {
                //var tmpString = Encoding.UTF8.GetString(data);
                if (state.complete == HTTPStateComplete.Init)
                {//process normally
                    HTTPResponse response;
                    if (state.waitedResponse == null)
                    {
                        response = new HTTPResponse();
                    }
                    else
                    {
                        response = state.waitedResponse;
                    }
                    response.Parse(data);
                    if (response.headerDataEnds == -1)
                    {
                        state.waitedResponse = response;
                        state.complete       = HTTPStateComplete.incompletedHeader;
                        request = null;
                        return(state);
                    }
                    else if (response.header.ContainsKey("Transfer-Encoding") && response.header["Transfer-Encoding"].Contains("chunked"))
                    {
                        state.waitedResponse = response;
                        state.complete       = HTTPStateComplete.isChunking;
                        request = null;
                        return(state);
                    }
                    else if (response.header.ContainsKey("Content-Length"))
                    {
                        state.Length = int.Parse(response.header["Content-Length"]) - response.bodyBytesLength;
                        if (state.Length == 0)
                        {
                            request = ProcessResponse(response, state);
                            if (request == null)
                            {
                                state.complete = HTTPStateComplete.Closing;
                            }
                            return(state);
                        }
                        state.complete       = HTTPStateComplete.isReadingByLength;
                        state.waitedResponse = response;
                        request = null;
                        return(state);
                    }
                    else
                    {
                        request = ProcessResponse(response, state);
                        if (request == null)
                        {
                            state.complete = HTTPStateComplete.Closing;
                        }
                        return(state);
                    }
                }
                else if (state.complete == HTTPStateComplete.isChunking)
                {//process chunked
                    //state.waitedResponse.body += Encoding.UTF8.GetString(data);
                    state.waitedResponse.AddBody(data);
                    int index = data.Length - 1;
                    if (data[index] == 10 && data[index - 1] == 13 && data[index - 2] == 10 && data[index - 3] == 13 && data[index - 4] == 48)
                    {//"0\r\n\r\n"
                        state.waitedResponse.body = state.waitedResponse.body.Substring(6, state.waitedResponse.body.Length - 12);
                        request = ProcessResponse(state.waitedResponse, state);
                        state.waitedResponse = null;
                        state.complete       = HTTPStateComplete.Init;
                        if (request == null)
                        {
                            state.complete = HTTPStateComplete.Closing;
                        }
                        return(state);
                    }
                    else
                    {
                        request = null;
                        return(state);
                    }
                }
                else if (state.complete == HTTPStateComplete.isReadingByLength)
                {//
                    state.Length -= data.Length;
                    state.waitedResponse.AddBody(data);
                    //var waitedData = Encoding.UTF8.GetString(data);
                    //state.Length -= Encoding.UTF8.GetByteCount(waitedData);
                    //state.waitedResponse.body += waitedData;
                    //state.waitedResponse.bodyBytesLength += Encoding.UTF8.GetByteCount(waitedData);
                    if (state.Length <= 0)
                    {
                        request = ProcessResponse(state.waitedResponse, state);
                        state.waitedResponse = null;
                        state.complete       = HTTPStateComplete.Init;
                        if (request == null)
                        {
                            state.complete = HTTPStateComplete.Closing;
                        }
                        return(state);
                    }
                    else
                    {
                        request = null;
                        return(state);
                    }
                }
                else if (state.complete == HTTPStateComplete.incompletedHeader)//incompleted header
                {
                    state.waitedResponse.AddBody(data);
                    state.waitedResponse.Parse(state.waitedResponse.binaryData);
                    if (state.waitedResponse.headerDataEnds == -1)
                    {
                        request = null;
                        return(state);
                    }
                    else
                    {
                        state.complete = HTTPStateComplete.Init;
                        return(ProcessHTTPResponse(state.waitedResponse.binaryData, state, out request));
                    }
                }
                else
                {
                    request = ProcessResponse(state.waitedResponse, state);
                    if (request == null)
                    {
                        state.complete = HTTPStateComplete.Closing;
                    }
                    return(state);
                }
                //if (state.isChunking || state.isReadingByLength)
                //{
                //    return true;
                //}
                //else
                //{
                //    return false;
                //}
            }
            catch (IndexOutOfRangeException e)
            {
                log(e.Message, ERROR, "ProcessHTTPResponse");
                log(data.Length.ToString(), ERROR, "ProcessHTTPResponse");
                log(Encoding.UTF8.GetString(data), ERROR, "ProcessHTTPResponse");
                state.waitedResponse.AddBody(data);
                request = null;
                return(state);

                //log(state.waitedResponse.body, ERROR, "ProcessHTTPResponse");
                throw e;
                //request = null;
                //return state;
            }
        }