public MetaDaemonApi(RpcConfig bitsharesConfig, RpcConfig bitcoinConfig, string bitsharesAccount, string databaseName, string databaseUser, string databasePassword, string listenAddress, string bitcoinFeeAddress, string bitsharesFeeAccount, string adminUsernames, string masterSiteUrl, string masterSiteIp, AsyncPump scheduler) : base(bitsharesConfig, bitcoinConfig, bitsharesAccount, adminUsernames, databaseName, databaseUser, databasePassword) { m_bitshaaresFeeAccount = bitsharesFeeAccount; m_bitcoinFeeAddress = bitcoinFeeAddress; m_masterSiteUrl = masterSiteUrl.TrimEnd('/'); m_scheduler = scheduler; ServicePointManager.ServerCertificateValidationCallback = Validator; Serialisation.Defaults(); // don't ban on exception here because we'll only end up banning the webserver! m_server = new ApiServer <IDummyDaemon>(new string[] { listenAddress }, null, false, eDdosMaxRequests.Ignore, eDdosInSeconds.One); m_api = new SharedApi <IDummyDaemon>(m_dataAccess); m_server.ExceptionEvent += m_api.OnApiException; // only allow the main site to post to us m_server.SetIpLock(masterSiteIp); m_marketHandlers = new Dictionary <string, MarketBase>(); // get all market pegged assets List <BitsharesAsset> allAssets = m_bitshares.BlockchainListAssets("", int.MaxValue); m_allBitsharesAssets = allAssets.ToDictionary(a => a.id); Dictionary <int, BitsharesAsset> peggedAssets = allAssets.Where(a => a.issuer_id <= 0).ToDictionary(a => a.id); // get all active markets containing those assets m_allDexMarkets = m_bitshares.BlockchainListMarkets().Where(m => m.last_error == null && peggedAssets.ContainsKey(m.base_id) && peggedAssets.ContainsKey(m.quote_id)).ToList(); m_allCurrencies = m_dataAccess.GetAllCurrencies(); List <MarketRow> markets = GetAllMarkets(); foreach (MarketRow r in markets) { m_marketHandlers[r.symbol_pair] = CreateHandlerForMarket(r); } m_server.HandlePostRoute(Routes.kSubmitAddress, OnSubmitAddress, eDdosMaxRequests.Ignore, eDdosInSeconds.Ignore, false); m_server.HandleGetRoute(Routes.kGetAllMarkets, OnGetAllMarkets, eDdosMaxRequests.Ignore, eDdosInSeconds.Ignore, false); }
public MetaServer(string uri, string webroot, string database, string databaseUser, string databasePassword, bool maintenance) { RedisWrapper.Initialise("meta"); Serialisation.Defaults(); m_auth = new MysqlAuthenticator(database, databaseUser, databasePassword, Thread.CurrentThread.ManagedThreadId); m_allCurrencies = m_auth.m_Database.GetAllCurrencies(); string[] listenOn = uri.Split(','); m_webAddress = listenOn.First(); #if MONO bool forwardToSsl = !Debugger.IsAttached; #else bool forwardToSsl = false; #endif m_server = new MetaWebServer(listenOn, webroot, m_auth, true, eDdosMaxRequests.Ten, eDdosInSeconds.One, 10, 50000, forwardToSsl); m_server.ExceptionEvent += OnServerException; m_server.ExceptionOnWebServer += OnServerException; List <IHeadResource> fonts = new List <IHeadResource>(); fonts.Add(new FontResource(webroot, "/fonts/glyphicons-halflings-regular.eot", FontResource.kEmeddedOpenTypeMime, true)); fonts.Add(new FontResource(webroot, "/fonts/glyphicons-halflings-regular.svg", FontResource.kSvgMimeType, true)); fonts.Add(new FontResource(webroot, "/fonts/glyphicons-halflings-regular.ttf", FontResource.kTrueTypeMime, true)); fonts.Add(new FontResource(webroot, "/fonts/glyphicons-halflings-regular.woff", FontResource.kWoffTypeMime, true)); m_server.AddGlobalResources(fonts); if (maintenance) { m_server.m_HttpServer.ReplaceUnhandledRouteObserver(async ctx => ctx.Respond(await m_server.HandleRequest <MaintenancePage>(ctx, m_auth.Authorise(ctx)), HttpStatusCode.OK)); } else { m_api = new SharedApi <IDummy>(m_auth.m_Database); PullInitialData(); // forwarding routes on to actual api server m_server.HandlePostRoute(Routes.kSubmitAddress, OnSubmitAddress, eDdosMaxRequests.Five, eDdosInSeconds.One, true, true); m_server.HandlePostRoute(Routes.kGetOrderStatus, m_api.OnGetOrderStatus, eDdosMaxRequests.Five, eDdosInSeconds.One, true, false); m_server.HandlePostRoute(Routes.kGetMarket, OnGetMarket, eDdosMaxRequests.Five, eDdosInSeconds.One, true, false); m_server.HandlePostRoute(Routes.kGetLastTransactions, m_api.OnGetLastTransactions, eDdosMaxRequests.Five, eDdosInSeconds.One, true, false); m_server.HandlePostRoute(Routes.kGetMyLastTransactions, m_api.OnGetMyLastTransactions, eDdosMaxRequests.Five, eDdosInSeconds.One, true, false); m_server.HandleGetRoute(Routes.kGetAllMarkets, OnGetAllMarkets, eDdosMaxRequests.Five, eDdosInSeconds.One, true, false); m_server.HandleGetRoute(Routes.kProduceReport, m_api.OnProduceReport, eDdosMaxRequests.One, eDdosInSeconds.One, true, false); // handle push from daemons m_server.HandlePostRoute(Routes.kPushFees, OnPushFeeCollection, eDdosMaxRequests.Unlimited, eDdosInSeconds.Ignore, true, false); m_server.HandlePostRoute(Routes.kPushTransactions, OnPushTransactions, eDdosMaxRequests.Unlimited, eDdosInSeconds.Ignore, true, true); m_server.HandlePostRoute(Routes.kPushMarket, OnPushMarket, eDdosMaxRequests.Unlimited, eDdosInSeconds.Ignore, true, false); // serve the pages m_server.HandlePageRequest <MarketsPage>("/", eDdosMaxRequests.Five, eDdosInSeconds.One, true); m_server.HandlePageRequest <MainPage>("/markets/{base}/{quote}", eDdosMaxRequests.Five, eDdosInSeconds.One, true); m_server.HandlePageRequest <ApiPage>("/apiDocs", eDdosMaxRequests.Five, eDdosInSeconds.One, true); m_server.HandlePageRequest <FaqPage>("/faq", eDdosMaxRequests.Five, eDdosInSeconds.One, true); } }