public async Task <IActionResult> IndexPost([FromHeader(Name = "osu-token")] string clientToken = null) { try { Response.Headers["cho-protocol"] = "19"; Response.Headers["Connection"] = "keep-alive"; Response.Headers["Keep-Alive"] = "timeout=60, max=100"; Response.Headers["cho-server"] = "Sora (https://github.com/Mempler/Sora)"; Response.StatusCode = 200; await using var body = new MemoryStream(); await Request.Body.CopyToAsync(body); body.Position = 0; await using var mw = MStreamWriter.New(); using var mr = new MStreamReader(body); var pr = new Presence(); if (string.IsNullOrEmpty(clientToken)) { Response.Headers["cho-token"] = pr.Token.ToString(); string ip = Request.Headers["X-Real-IP"]; if (string.IsNullOrEmpty(ip)) { ip = "127.0.0.1"; } await _evManager.RunEvent(EventType.BanchoLoginRequest, new BanchoLoginRequestArgs { Reader = mr, Writer = mw, Pr = pr, IpAddress = ip, }); mw.Flush(); return(await RetOut(mw.BaseStream)); } if (_presenceService.TryGet(new Token(clientToken.Trim()), out pr)) { while (true) { try { pr["LAST_PONG"] = DateTime.Now; if (Request.ContentLength - body.Position < 7) { break; // Dont handle any invalid packets! (less then bytelength of 7) } var packetId = (PacketId)mr.ReadInt16(); mr.ReadBoolean(); var packetData = mr.ReadBytes(); await using var packetDataStream = new MemoryStream(packetData); using var packetDataReader = new MStreamReader(packetDataStream); await _evManager.RunEvent( EventType.BanchoPacket, new BanchoPacketArgs { Pr = pr, PacketId = packetId, Data = packetDataReader } ); } catch (Exception ex) { Logger.Err(ex); break; } } try { await using var m = new MemoryStream(); if (Response.Body.CanWrite) { pr.WritePackets(m); } return(await RetOut(m)); } catch (Exception ex) { Logger.Err(ex); // Ignored because it may throw an exception. } } else { return(StatusCode(403)); } } catch (Exception ex) { Logger.Err(ex); } return(Ok()); }
private void Exception(MStreamWriter dataWriter) { dataWriter.Write(new LoginResponse(LoginResponses.Exception)); }
private void Success(MStreamWriter dataWriter, int userid) { dataWriter.Write(new LoginResponse((LoginResponses)userid)); }
private void LoginFailed(MStreamWriter dataWriter) { dataWriter.Write(new LoginResponse(LoginResponses.Failed)); }