Esempio n. 1
0
        /// <summary>
        /// Accept browser connections
        /// </summary>
        /// <param name="ar">Async Result Object</param>
        private void AcceptCallback(IAsyncResult ar)
        {
            try
            {
                Socket     clientSocket = serverSocket.EndAccept(ar);
                ReadObject readObject   = new ReadObject()
                {
                    client        = clientSocket,
                    buffer        = new byte[1024],
                    contentLength = 0,
                    http          = new HTTPRequest()
                    {
                        firstData = true
                    }
                };

                clientSocket.BeginReceive(readObject.buffer, 0, readObject.buffer.Length, SocketFlags.None, new AsyncCallback(ReadCallback), readObject);
            }
            catch (Exception)
            {
                throw;
            }

            serverSocket.BeginAccept(new AsyncCallback(AcceptCallback), null);
        }
Esempio n. 2
0
        public Task SendToAll(ReadObject readObject, bool isUpdate = false, CancellationToken cancellationToken = default)
        {
            var message = isUpdate
                ? "update"
                : "insert";

            return(_hubContext.Clients.All.SendAsync(message, readObject, cancellationToken));
        }
Esempio n. 3
0
        public Task SendToGroup(string group, ReadObject readObject, bool isUpdate = false, CancellationToken cancellationToken = default)
        {
            var message = isUpdate
                ? "update"
                : "insert";

            var hubGroup = _hubContext.Clients.Group(group);

            return(hubGroup.SendAsync(message, readObject, cancellationToken));
        }
Esempio n. 4
0
 public ReadObject ToReadObject()
 {
     if (t == 0)
     {
         RD = new ReadObject(sprite);
     }
     else if (t == TypeObj.Text)
     {
         RD = new ReadObject(text, TypeObj.Text);
     }
     else if (t == TypeObj.Title)
     {
         RD = new ReadObject(text, TypeObj.Title);
     }
     return(RD);
 }
Esempio n. 5
0
        private void RequestCallback(IAsyncResult ar)
        {
            //异步执行到此,说明BeginConnect已完成,但未结束,需要解除阻塞,并调用EndConnect
            allDone.Set();
            try
            {
                client = (TcpClient)ar.AsyncState;
                client.EndConnect(ar);
                networkStream = client.GetStream();
                ReadObject readObject = new ReadObject(networkStream, client.ReceiveBufferSize);

                networkStream.BeginRead(readObject.bytes, 0, readObject.bytes.Length, ReadCallback, readObject);
            }
            catch (Exception err)
            {
                return;
            }
        }
Esempio n. 6
0
        private void ReadCallback(IAsyncResult ar)
        {
            //异步执行操作到此,说明BeginRead已完成
            try
            {
                ReadObject readObject = (ReadObject)ar.AsyncState;
                int        count      = readObject.netStream.EndRead(ar);
                string     str        = System.Text.Encoding.UTF8.GetString(readObject.bytes, 0, count);
                Console.WriteLine(str);



                string[] IPs = str.Split(';');


                int posization = str.IndexOf(";");
                if (posization != -1)
                {
                    str = str.Remove(posization);
                }

                int posization1 = str.IndexOf("*");
                if (posization1 != -1)
                {
                    string[] temp = str.Split('*');

                    richTextBoxReceive.Invoke(setRichTextBoxReceiveCallback, temp[0]);
                }
                else
                {
                    richTextBoxReceive.Invoke(setRichTextBoxReceiveCallback, str);
                }

                if (isExit == false)
                {
                    readObject = new ReadObject(networkStream, client.ReceiveBufferSize);
                    networkStream.BeginRead(readObject.bytes, 0, readObject.bytes.Length, ReadCallback, readObject);
                }
            }
            catch (Exception ex)
            {
                richTextBoxReceive.Invoke(setRichTextBoxReceiveCallback, ex.Message);
            }
        }
Esempio n. 7
0
        /// <summary>
        /// Accept new connections
        /// </summary>
        /// <param name="ar">Async Result</param>
        private void AcceptCallback(IAsyncResult ar)
        {
            Socket client = null;

            try
            {
                client = serverSocket.EndAccept(ar);
            }
            catch (Exception ex)
            {
                ServerError?.Invoke(ex);
                return;
            }
            DeviceConnected?.Invoke((IPEndPoint)client.RemoteEndPoint);

            ReadObject readObject = new ReadObject()
            {
                client = client, buffer = new byte[1024], isFirstMessage = true, session = new SessionCrypto()
            };

            client.BeginReceive(readObject.buffer, 0, readObject.buffer.Length, SocketFlags.None, new AsyncCallback(ReadCallback), readObject);
            serverSocket.BeginAccept(new AsyncCallback(AcceptCallback), null);
        }
Esempio n. 8
0
        public ObjectAclBuilder AddGroup(PredefinedGroup group, ObjectPermissions permissions)
        {
            if (permissions.HasAnyFlags(ObjectPermissions.Read))
            {
                ReadObject.AddGroup(group);
            }

            if (permissions.HasAnyFlags(ObjectPermissions.ReadAcl))
            {
                ReadAcl.AddGroup(group);
            }

            if (permissions.HasAnyFlags(ObjectPermissions.WriteAcl))
            {
                WriteAcl.AddGroup(group);
            }

            if (permissions.HasAnyFlags(ObjectPermissions.FullControl))
            {
                FullControl.AddGroup(group);
            }

            return(this);
        }
Esempio n. 9
0
        public ObjectAclBuilder AddGroup(string uri, ObjectPermissions permissions)
        {
            if (permissions.HasAnyFlags(ObjectPermissions.Read))
            {
                ReadObject.AddGroup(uri);
            }

            if (permissions.HasAnyFlags(ObjectPermissions.ReadAcl))
            {
                ReadAcl.AddGroup(uri);
            }

            if (permissions.HasAnyFlags(ObjectPermissions.WriteAcl))
            {
                WriteAcl.AddGroup(uri);
            }

            if (permissions.HasAnyFlags(ObjectPermissions.FullControl))
            {
                FullControl.AddGroup(uri);
            }

            return(this);
        }
Esempio n. 10
0
        public ObjectAclBuilder AddEmail(string email, ObjectPermissions permissions)
        {
            if (permissions.HasAnyFlags(ObjectPermissions.Read))
            {
                ReadObject.AddEmail(email);
            }

            if (permissions.HasAnyFlags(ObjectPermissions.ReadAcl))
            {
                ReadAcl.AddEmail(email);
            }

            if (permissions.HasAnyFlags(ObjectPermissions.WriteAcl))
            {
                WriteAcl.AddEmail(email);
            }

            if (permissions.HasAnyFlags(ObjectPermissions.FullControl))
            {
                FullControl.AddEmail(email);
            }

            return(this);
        }
Esempio n. 11
0
    public ObjectAclBuilder AddUserId(string userId, ObjectPermissions permissions)
    {
        if (permissions.HasFlag(ObjectPermissions.Read))
        {
            ReadObject.AddUserId(userId);
        }

        if (permissions.HasFlag(ObjectPermissions.ReadAcl))
        {
            ReadAcl.AddUserId(userId);
        }

        if (permissions.HasFlag(ObjectPermissions.WriteAcl))
        {
            WriteAcl.AddUserId(userId);
        }

        if (permissions.HasFlag(ObjectPermissions.FullControl))
        {
            FullControl.AddUserId(userId);
        }

        return(this);
    }
Esempio n. 12
0
        /// <summary>
        /// Read messages from the device
        /// </summary>
        /// <param name="ar">Async Result</param>
        private void ReadCallback(IAsyncResult ar)
        {
            int        bytesRead  = 0;
            bool       noRead     = false;
            ReadObject readObject = (ReadObject)ar.AsyncState;

            try
            {
                bytesRead = readObject.client.EndReceive(ar);
            }
            catch (Exception ex)
            {
                ServerError?.Invoke(ex);
                return;
            }

            if (bytesRead > 0)
            {
                if (readObject.isFirstMessage)
                {
                    string derPublicKey = keyGeneration.GetDerPublicKey();
                    SendString(readObject.client, derPublicKey);
                    Form1.WriteLine("Public Key Sent");
                    readObject.isFirstMessage = false;
                }
                else
                {
                    byte[] dataReceived = new byte[bytesRead];
                    Array.Copy(readObject.buffer, dataReceived, bytesRead);
                    string textData = Encoding.UTF8.GetString(dataReceived);

                    if (textData.StartsWith("set-session-key"))
                    {
                        Form1.WriteLine("Got set session key");
                        string encryptedSessionKey = textData.Substring(15);
                        string sessionKey          = Encoding.UTF8.GetString(keyGeneration.DecryptData(Convert.FromBase64String(encryptedSessionKey)));
                        readObject.session.SetSessionKey(sessionKey);
                    }
                    else
                    {
                        Form1.WriteLine("Got session message");
                        byte[] sessionData     = readObject.session.DecryptData(textData);
                        string sessionTextData = Encoding.UTF8.GetString(sessionData);
                        Form1.WriteLine($"Session Data: {sessionTextData}");
                        if (sessionTextData.StartsWith("res-"))
                        {
                            Form1.WriteLine("Got request setter");
                            readObject.requestString = sessionTextData.Substring(sessionTextData.IndexOf('-') + 1);
                            Form1.WriteLine($"Request string set to: {readObject.requestString}");
                            SendString(readObject.client, Convert.ToBase64String(readObject.session.EncryptData(Encoding.UTF8.GetBytes("no-data"))));
                            Form1.WriteLine("Continue message sent to client");
                        }
                        else if (sessionTextData.StartsWith("no-"))
                        {
                            Form1.WriteLine($"Couldn't find credentials on the device: {sessionTextData}");
                            string parameter = sessionTextData.Substring(sessionTextData.IndexOf('-') + 1);
                            if (parameter == "setup")
                            {
                                LockStateChanged?.Invoke(LockState.Failed);
                            }
                            else if (parameter == "fp")
                            {
                                Form1.WriteLine("User failed to authenticate with fingerprint!");
                                if (readObject.requestString == "getkname-windowsLogon")
                                {
                                    WindowsLocking.CancelRegistration();
                                }
                                else if (readObject.requestString.StartsWith("pw-"))
                                {
                                    Form1.WriteLine("Password get failed");
                                    if (jsSrv != null)
                                    {
                                        jsSrv.getPasswordQueue.UpdateState(readObject.requestString.Substring(3), JavascriptServer.CredentialTransferState.Failed);
                                    }
                                }
                                else if (readObject.requestString.StartsWith("storpw-"))
                                {
                                    Form1.WriteLine("Password storage failed");
                                    if (jsSrv != null)
                                    {
                                        jsSrv.getPasswordQueue.UpdateState(readObject.requestString.Substring(7), JavascriptServer.CredentialTransferState.Failed);
                                    }
                                }
                                else if (readObject.requestString.StartsWith("getkname-"))
                                {
                                    Form1.WriteLine("Get key failed");
                                    if (jsSrv != null)
                                    {
                                        jsSrv.getPasswordQueue.UpdateState(readObject.requestString.Substring(10), JavascriptServer.CredentialTransferState.Failed);
                                    }
                                }
                            }

                            noRead = true;
                        }
                        else if (sessionTextData == "getuser")
                        {
                            if (jsSrv == null)
                            {
                                throw new InvalidOperationException("Can't store password while javascript server is down");
                            }
                            object[] data = jsSrv.storePasswordQueue.GetQueueData(readObject.requestString.Substring(7));
                            if (data == null || data.Length != 2)
                            {
                                throw new NullReferenceException("Can't find credentials for the specified web site hash");
                            }
                            readObject.credentials.username = (string)data[0];
                            readObject.credentials.password = (string)data[1];
                            SendString(readObject.client, Convert.ToBase64String(readObject.session.EncryptData(Encoding.UTF8.GetBytes(readObject.credentials.username))));
                        }
                        else if (sessionTextData == "getpass")
                        {
                            SendString(readObject.client, Convert.ToBase64String(readObject.session.EncryptData(Encoding.UTF8.GetBytes(readObject.credentials.password))));
                            if (jsSrv != null)
                            {
                                jsSrv.storePasswordQueue.UpdateState(readObject.requestString.Substring(7), JavascriptServer.CredentialTransferState.Success);
                            }
                            DismissIfOpen?.Invoke();
                            noRead = true;
                        }
                        else if (sessionTextData.StartsWith("usresp-"))
                        {
                            string parameter = sessionTextData.Substring(sessionTextData.IndexOf('-') + 1);
                            readObject.credentials.username = parameter;
                            Form1.WriteLine($"Got credentials: usr: {readObject.credentials.username} ; pwd: {readObject.credentials.password}");
                            if (jsSrv == null)
                            {
                                throw new NullReferenceException("Javascript Server was down when trying to get credentials data");
                            }
                            jsSrv.getPasswordQueue.UpdateExtraData(readObject.requestString.Substring(3), readObject.credentials.username, readObject.credentials.password);
                            jsSrv.getPasswordQueue.UpdateState(readObject.requestString.Substring(3), JavascriptServer.CredentialTransferState.Success);
                            noRead = true;
                        }
                        else if (sessionTextData.StartsWith("pushkey-"))
                        {
                            string key = sessionTextData.Substring(sessionTextData.IndexOf('-') + 1);

                            if (readObject.requestString == "win")
                            {
                                if (WindowsLocking.IsLogonValid(key))
                                {
                                    LockStateChanged?.Invoke(LockState.Unlocked);
                                }
                                else
                                {
                                    LockStateChanged?.Invoke(LockState.Failed);
                                }
                            }
                            else if (readObject.requestString == "lock")
                            {
                                if (WindowsLocking.IsLogonValid(key))
                                {
                                    LockStateChanged?.Invoke(LockState.Locked);
                                }
                                else
                                {
                                    LockStateChanged?.Invoke(LockState.Failed);
                                }
                            }
                            else
                            {
                                if (jsSrv == null)
                                {
                                    throw new NullReferenceException("Javascript server is down when trying to forward 2fa key");
                                }
                                jsSrv.getKeyQueue.UpdateExtraData(readObject.requestString.Substring(10), key);
                                jsSrv.getKeyQueue.UpdateState(readObject.requestString.Substring(10), JavascriptServer.CredentialTransferState.Success);
                            }

                            noRead = true;
                        }
                        else if (sessionTextData.StartsWith("pwresp-"))
                        {
                            string parameter = sessionTextData.Substring(sessionTextData.IndexOf('-') + 1);
                            readObject.credentials.password = parameter;
                            DismissIfOpen?.Invoke();
                        }
                        else if (sessionTextData == "getkvalue")
                        {
                            string parameter = readObject.requestString.Substring(readObject.requestString.IndexOf('-') + 1);
                            string pushKey;
                            if (parameter == "windowsLogon") //Windows Lock Authentication
                            {
                                string lockingKey = WindowsLocking.RegisterLogon();
                                pushKey = lockingKey;
                            }
                            else
                            {
                                if (jsSrv == null)
                                {
                                    throw new NullReferenceException("Javascript server was down when trying to send key to android device");
                                }
                                if (jsSrv.storeKeyQueue.Contains(readObject.requestString.Substring(9)))
                                {
                                    pushKey = (string)jsSrv.storeKeyQueue.GetQueueData(readObject.requestString.Substring(9))[0];
                                }
                                else
                                {
                                    pushKey = "fail";
                                }
                            }

                            if (pushKey == null)
                            {
                                pushKey = "fail";
                            }

                            SendString(readObject.client, Convert.ToBase64String(readObject.session.EncryptData(Encoding.UTF8.GetBytes(pushKey))));
                            if (pushKey == "fail")
                            {
                                Form1.WriteLine("PushKey set to fail!");
                                jsSrv.storeKeyQueue.UpdateState(readObject.requestString.Substring(9), JavascriptServer.CredentialTransferState.Failed);
                            }
                            else
                            {
                                jsSrv.storeKeyQueue.UpdateState(readObject.requestString.Substring(9), JavascriptServer.CredentialTransferState.Success);
                            }
                            noRead = true;
                        }
                    }
                }
            }

            Array.Clear(readObject.buffer, 0, readObject.buffer.Length);
            if (!noRead)
            {
                readObject.client.BeginReceive(readObject.buffer, 0, readObject.buffer.Length, SocketFlags.None, new AsyncCallback(ReadCallback), readObject);
            }
        }
Esempio n. 13
0
        /// <summary>
        /// Handle a full HTTP Request
        /// </summary>
        /// <param name="headers">Headers of the request</param>
        /// <param name="readObject">The client's session data</param>
        /// <param name="method">The method of the request</param>
        /// <param name="resource">The requested function</param>
        /// <param name="requestData">The body of the request</param>
        private void HandleRequest(List <string> headers, ReadObject readObject, string method, string resource, string requestData)
        {
            bool gotTracker = false; //True if client sent tracker in the headers

            //Check if client sent header
            foreach (string header in headers)
            {
                if (header.StartsWith("Client-Tracker"))
                {
                    int    delimiter = header.IndexOf(':') + 2; //The : and the space => 2
                    string value     = header.Substring(delimiter);
                    if (int.TryParse(value, out int tracker))
                    {
                        lock (trackerLockObject)
                        {
                            if (trackers.TryGetValue(tracker, out ReadObject tempReadObject))
                            {
                                readObject = tempReadObject;
                                gotTracker = true;
                            }
                            else
                            {
                                Form1.WriteLine("Client not registered with this ID");
                            }
                        }
                    }
                    else
                    {
                        Form1.WriteLine("Can't parse client tracker");
                    }

                    break;
                }
            }

            if (method == "POST" && gotTracker) //POST Functions
            {
                if (resource == "stor-pw")      //Store password on phone
                {
                    string userName = null;
                    string password = null;

                    int userNameLength = int.Parse(requestData.Substring(0, 10));
                    userName = requestData.Substring(10, userNameLength);
                    int passwordLength = int.Parse(requestData.Substring(10 + userNameLength, 10));
                    password = requestData.Substring(20 + userNameLength, passwordLength);
                    string url = requestData.Substring(20 + userNameLength + passwordLength);

                    if (password != null && userName != null)
                    {
                        Form1.WriteLine($"Requested Password Storage: usr:{userName} ; pwd:{password}; url:{url}");
                        readObject.urlHash  = SessionCrypto.DigestMessage(url);
                        readObject.userName = userName;
                        readObject.password = password;
                        ctx.RequestPasswordStore(url, userName, password);
                        SendMessage(readObject.client, "stor-init");
                    }
                }
                else if (resource == "getpw") //Get password from phone
                {
                    readObject.urlHash = SessionCrypto.DigestMessage(requestData);
                    getPasswordQueue.Add(readObject.urlHash);
                    ctx.RequestPasswordGet(readObject.urlHash);
                    SendMessage(readObject.client, "ok");
                }
                else if (resource == "getkey")
                {
                    readObject.urlHash = SessionCrypto.DigestMessage(requestData);
                    getKeyQueue.Add(readObject.urlHash);
                    ctx.RequestKeyGet(readObject.urlHash);
                    SendMessage(readObject.client, "get-ok");
                }
                else if (resource == "pushkey")
                {
                    int    urlLength   = int.Parse(requestData.Substring(0, 10));
                    string url         = requestData.Substring(10, urlLength);
                    int    tokenLength = int.Parse(requestData.Substring(10 + urlLength, 10));
                    string token       = requestData.Substring(20 + urlLength, tokenLength);
                    readObject.urlHash = SessionCrypto.DigestMessage(url);
                    storeKeyQueue.Add(readObject.urlHash);
                    storeKeyQueue.UpdateExtraData(readObject.urlHash, token);
                    ctx.RequestKeyStore(readObject.urlHash);
                    SendMessage(readObject.client, "push-ok");
                    Form1.WriteLine($"ReadObject url hashed: {readObject.urlHash}");
                }

                readObject.contentLength = 0;
            }
            else if (method == "GET")      //Get functions
            {
                if (resource == "tracker") //Client requested a new tracker ID
                {
                    lock (idLockerObject)
                    {
                        readObject.cTracker = clientTracker;
                        SendMessage(readObject.client, clientTracker.ToString());
                        clientTracker++;
                    }
                }
                else if (!gotTracker) //Drop if not setting tracker and tracker is not set
                {
                    Form1.WriteLine("GET without tracker and not setting tracker");
                }
                else if (resource == "stor-state") //Get the state of storing the password on the phone
                {
                    CredentialTransferState state = (storeQueue.TryGetValue(readObject.urlHash, out CredentialTransferState cts)) ? cts : CredentialTransferState.Pending;
                    string message;
                    switch (state)
                    {
                    case CredentialTransferState.Success:
                        message = "stor-completed";
                        break;

                    case CredentialTransferState.Failed:
                        message = "stor-fail";
                        break;

                    default:
                        message = "stor-pending";
                        break;
                    }

                    SendMessage(readObject.client, message);
                    Form1.WriteLine("Stor get state");
                }
                else if (resource == "get-state") //Get the state of getting hte password from the phone
                {
                    CredentialTransferState qState = getPasswordQueue.GetQueueState(readObject.urlHash);

                    switch (qState)
                    {
                    case CredentialTransferState.Success:
                        object[] extraData = getPasswordQueue.GetQueueData(readObject.urlHash);
                        Tuple <string, string> credentials = new Tuple <string, string>((string)extraData[0], (string)extraData[1]);
                        getPasswordQueue.Remove(readObject.urlHash);
                        SendMessage(readObject.client, $"get-ok{EncodeBodyData(new string[] { credentials.Item1, credentials.Item2 })}");
                        Form1.WriteLine("Password sent to browser");
                        break;

                    case CredentialTransferState.Failed:
                        SendMessage(readObject.client, "get-fail");
                        getPasswordQueue.Remove(readObject.urlHash);
                        Form1.WriteLine("Password fail alert sent to the browser");
                        break;

                    default:
                        SendMessage(readObject.client, "get-pending");
                        break;
                    }
                }
                else if (resource == "kget-state")
                {
                    CredentialTransferState qState = getKeyQueue.GetQueueState(readObject.urlHash);

                    switch (qState)
                    {
                    case CredentialTransferState.Success:
                        object[] extraData = getKeyQueue.GetQueueData(readObject.urlHash);
                        string   keyToken  = (string)extraData[0];
                        getKeyQueue.Remove(readObject.urlHash);
                        SendMessage(readObject.client, $"get-ok{keyToken}");
                        Form1.WriteLine("Key sent to browser");
                        break;

                    case CredentialTransferState.Failed:
                        SendMessage(readObject.client, "get-fail");
                        getKeyQueue.Remove(readObject.urlHash);
                        Form1.WriteLine("Key fail alert sent to the browser");
                        break;

                    default:
                        SendMessage(readObject.client, "get-pending");
                        break;
                    }
                }
                else if (resource == "kpush-state")
                {
                    Form1.WriteLine($"ReadObject url hash: {readObject.urlHash}");
                    Form1.WriteLine($"ReadObject client tracker: {readObject.cTracker}");
                    CredentialTransferState qState = storeKeyQueue.GetQueueState(readObject.urlHash);

                    switch (qState)
                    {
                    case CredentialTransferState.Success:
                        object[] extraData = storeKeyQueue.GetQueueData(readObject.urlHash);
                        storeKeyQueue.Remove(readObject.urlHash);
                        SendMessage(readObject.client, $"push-ok");
                        Form1.WriteLine("Key installed on android");
                        break;

                    case CredentialTransferState.Failed:
                        SendMessage(readObject.client, "push-fail");
                        storeKeyQueue.Remove(readObject.urlHash);
                        Form1.WriteLine("Key install failed in android");
                        break;

                    default:
                        SendMessage(readObject.client, "push-pending");
                        break;
                    }
                }

                readObject.contentLength = 0;
            }
            else if (method == "OPTIONS")
            {
                SendMessage(readObject.client, "", "\r\nAccess-Control-Allow-Headers: Client-Tracker");
                Form1.WriteLine("Options response sent");
                readObject.contentLength = 0;
                return;
            }
            else if (!gotTracker) //POST Request (or other?) without tracker
            {
                Form1.WriteLine("Tracker not sent with!");
                readObject.contentLength = 0;
                return;
            }
            else //Invalid request but tracker is set? wierd
            {
                Form1.WriteLine("Invalid Request Type");
                readObject.contentLength = 0;
                return;
            }

            //Store the session data
            lock (trackerLockObject)
            {
                if (trackers.ContainsKey(readObject.cTracker))
                {
                    trackers[readObject.cTracker] = readObject;
                }
                else
                {
                    trackers.Add(readObject.cTracker, readObject);
                }
            }
        }
Esempio n. 14
0
        /// <summary>
        /// Read data from the browser request
        /// </summary>
        /// <param name="ar">Async Result Object</param>
        private void ReadCallback(IAsyncResult ar)
        {
            int        bytesRead  = -1;
            ReadObject readObject = (ReadObject)ar.AsyncState;

            try
            {
                bytesRead = readObject.client.EndReceive(ar);
            }
            catch (Exception)
            {
                throw;
            }

            if (bytesRead > 0)
            {
                string textData = Encoding.ASCII.GetString(readObject.buffer, 0, bytesRead);                 //Get the HTTP Request

                if (readObject.http.firstData)                                                               //First request data
                {
                    readObject.http.firstData = false;                                                       //Next request isn't first
                    string[] dataLines   = textData.Split(new String[] { "\r\n" }, StringSplitOptions.None); //Get the lines of the request
                    string   requestLine = "";
                    readObject.http.headers     = new List <string>();
                    readObject.http.requestData = "";
                    bool addRequestData = false; //True if request body should be created
                    foreach (string line in dataLines)
                    {
                        if (requestLine == "")
                        {
                            requestLine = line;                    //First line is always request line
                        }
                        else if (line == "")
                        {
                            addRequestData = true;                  //Empty line means end of headers
                        }
                        else if (!addRequestData)
                        {
                            readObject.http.headers.Add(line);                       //Add headers if not ended
                        }
                        else if (addRequestData)
                        {
                            readObject.http.requestData += line;                      //Append request body if headers ended
                        }
                    }

                    //Parse the content length
                    readObject.http.contentLength = -1;

                    foreach (string header in readObject.http.headers)
                    {
                        if (header.StartsWith("Content-Length: "))
                        {
                            int delimiter = header.IndexOf(':') + 2;
                            readObject.http.contentLength = int.Parse(header.Substring(delimiter));
                        }
                    }

                    string[] reqLineParts = requestLine.Split(' ');
                    readObject.http.method   = reqLineParts[0];              //Set the request method
                    readObject.http.resource = reqLineParts[1].Substring(1); //Set the requested URL
                }
                else //Request fragmented, append the request body
                {
                    readObject.http.requestData += textData;
                }


                if (readObject.http.contentLength != -1 && ((readObject.http.contentLength > 0 && readObject.http.requestData == "") ||
                                                            (readObject.http.contentLength != readObject.http.requestData.Length))) //Browser didn't send the request (full) body in this message
                {
                    Form1.WriteLine("Request fragmented");
                }
                else //The request is fully appended
                {
                    Form1.WriteLine("Request completed");
                    HandleRequest(readObject.http.headers, readObject, readObject.http.method, readObject.http.resource, readObject.http.requestData); //Handle the request
                    readObject.http = new HTTPRequest()
                    {
                        firstData = true
                    };                                                        //Reset the request related data
                    Form1.WriteLine("Request handled");
                }

                Array.Clear(readObject.buffer, 0, readObject.buffer.Length);                                                                                   //Clear receive buffer
                readObject.client.BeginReceive(readObject.buffer, 0, readObject.buffer.Length, SocketFlags.None, new AsyncCallback(ReadCallback), readObject); //Receive again from the stream
            }
        }
Esempio n. 15
0
 public ReadWriteObject(WriteObject write, ReadObject read)
 {
     Write = write;
     Read  = read;
 }
Esempio n. 16
0
        private void ReadCallback(IAsyncResult ar)
        {
            //异步执行操作到此,说明BeginRead已完成
            try
            {
                ReadObject readObject = (ReadObject)ar.AsyncState;
                int        count      = readObject.netStream.EndRead(ar);
                string     str        = System.Text.Encoding.UTF8.GetString(readObject.bytes, 0, count);
                Console.WriteLine(str);

                if (str.Contains("务器已连接") == true)
                {
                    str = "*" + str;
                    string ip = TextGainCenter("*", "服务器", str);
                    Lance_post_测试.HttpHelper http = new HttpHelper();
                    Lance_post_测试.HttpItem   item = new HttpItem();
                    HttpResult result             = new HttpResult();

                    item = new HttpItem()
                    {
                        URL         = "http://localhost/api/login/ipupdata",//URL     必需项
                        UserAgent   = "Mozilla/4.0 (compatible; MSIE 9.0; Windows NT 6.1)",
                        Method      = "post",
                        Postdata    = "ip=" + ip + "&user="******"zfy666ci",
                        ContentType = "application/x-www-form-urlencoded; Charset=UTF-8",
                        Accept      = "*/*",
                    };
                    result = http.GetHtml(item);
                    Console.WriteLine(ip);
                    Console.WriteLine("IP更新完毕");
                }
                ;


                string[] IPs = str.Split(';');


                int posization = str.IndexOf(";");
                if (posization != -1)
                {
                    str = str.Remove(posization);
                }

                int posization1 = str.IndexOf("*");
                if (posization1 != -1)
                {
                    string[] temp = str.Split('*');

                    richTextBoxReceive.Invoke(setRichTextBoxReceiveCallback, temp[0]);
                }
                else
                {
                    richTextBoxReceive.Invoke(setRichTextBoxReceiveCallback, str);
                }

                if (isExit == false)
                {
                    readObject = new ReadObject(networkStream, client.ReceiveBufferSize);
                    networkStream.BeginRead(readObject.bytes, 0, readObject.bytes.Length, ReadCallback, readObject);
                }
            }
            catch (Exception ex)
            {
            }
        }