Example #1
0
        static void SubmitNimigem(Uri nimigemUri, byte[] payload, string mime)
        {
            var resp = (NimigemResponse)Nimigem.Fetch(nimigemUri, payload, mime);

            if ((resp.codeMajor == '2') && (resp.codeMinor == '5'))
            {
                //success status 25 - fetch the Gemini target
                LoadGeminiLink(new Uri(resp.meta));
            }
            else
            {
                //everything else is a problem for now
                Dialogs.MsgBoxOK("Error", "Could not send content. Server Message was: \n" + resp.meta);
            }
        }
Example #2
0
        public void NavigateNimigemScheme(string fullQuery, System.Windows.Navigation.NavigatingCancelEventArgs e, string payload, bool requireSecure = true)
        {
            var NimigemUri = e.Uri.OriginalString;

            //at present we only support UTF8 plain text payloads
            byte[] nimigemBody = Encoding.UTF8.GetBytes(payload);
            var    mime        = "text/plain; charset=utf-8";

            var settings = new UserSettings();

            var uri = new Uri(fullQuery);
            //use a proxy for any other scheme that is not Nimigem
            var proxy = "";     //use none

            var connectInsecure = false;

            if (uri.Host == "localhost")
            {
                //to support local testing servers, dont require secure connection on localhost
                //**FIX ME, or have an option
                connectInsecure = true;
            }

            X509Certificate2 certificate;

            certificate = Session.Instance.CertificatesManager.GetCertificate(uri.Host);

            try
            {
                NimigemResponse nimigemResponse;
                try
                {
                    nimigemResponse = (NimigemResponse)Nimigem.Fetch(uri, nimigemBody, mime, certificate, proxy, connectInsecure, settings.MaxDownloadSizeMb * 1024, settings.MaxDownloadTimeSeconds);
                }
                catch (Exception err)
                {
                    //warn, but continue if there are server validation errors
                    //in these early days of Nimigem we dont forbid visiting a site with an expired cert or mismatched host name
                    //but we do give a warning each time
                    if (err.Message == "The remote certificate was rejected by the provided RemoteCertificateValidationCallback.")
                    {
                        mMainWindow.ToastNotify("Note: " + err.Message + " for: " + e.Uri.Authority, ToastMessageStyles.Warning);

                        //try again insecure this time
                        nimigemResponse = (NimigemResponse)Nimigem.Fetch(uri, nimigemBody, mime, certificate, proxy, connectInsecure, settings.MaxDownloadSizeMb * 1024, settings.MaxDownloadTimeSeconds);
                    }

                    else
                    {
                        //reraise
                        throw;
                    }
                }

                if (nimigemResponse.codeMajor == '1')
                {
                    //invalid in nimigem
                    HandleInvalidResponse(nimigemResponse);
                }

                else if (nimigemResponse.codeMajor == '2')
                {
                    //success
                    if (nimigemResponse.codeMinor == '5')
                    {
                        //valid submission - get the new target to retrieve
                        mMainWindow.ToastNotify(String.Format("Submit successful: retrieving result: {0}", nimigemResponse.meta));

                        var successUri = new Uri(nimigemResponse.meta);

                        //must be a response redirect to gemini URL
                        if (successUri.Scheme != "gemini")
                        {
                            HandleInvalidResponse(nimigemResponse);
                        }


                        var geminiTarget  = new GeminiNavigator(mMainWindow, mMainWindow.BrowserControl);
                        var normalisedUri = UriTester.NormaliseUri(successUri);

                        var siteIdentity = new SiteIdentity(normalisedUri, Session.Instance);

                        geminiTarget.NavigateGeminiScheme(successUri.OriginalString, e, siteIdentity);
                    }
                    else
                    {
                        //no other 2X responses are valid
                        HandleInvalidResponse(nimigemResponse);
                    }
                }

                // codemajor = 3 is redirect - should eventually end in success or raise an error

                else if (nimigemResponse.codeMajor == '4')
                {
                    //same as normal Gemini
                    mMainWindow.ToastNotify("Temporary failure (status 4X)\n\n" +
                                            nimigemResponse.meta + "\n\n" +
                                            e.Uri.ToString(), ToastMessageStyles.Warning);
                }
                else if (nimigemResponse.codeMajor == '5')
                {
                    //same as normal Gemini
                    if (nimigemResponse.codeMinor == '1')
                    {
                        mMainWindow.ToastNotify("Page not found\n\n" + e.Uri.ToString(), ToastMessageStyles.Warning);
                    }
                    else
                    {
                        mMainWindow.ToastNotify("Permanent failure (status 5X)\n\n" +
                                                nimigemResponse.meta + "\n\n" +
                                                e.Uri.ToString(), ToastMessageStyles.Warning);
                    }
                }
                else if (nimigemResponse.codeMajor == '6')
                {
                    mMainWindow.ToastNotify("Certificate required. Choose one and try again.\n\n" + e.Uri.ToString(), ToastMessageStyles.Warning);
                }

                else
                {
                    mMainWindow.ToastNotify("Unexpected output from server " +
                                            "(status " + nimigemResponse.codeMajor + "." + nimigemResponse.codeMinor + ") " +
                                            nimigemResponse.meta + "\n\n"
                                            + e.Uri.ToString(), ToastMessageStyles.Warning);
                }
            }
            catch (Exception err)
            {
                //generic handler for other runtime errors
                mMainWindow.ToastNotify("Error getting Nimigem content for " + e.Uri.ToString() + "\n\n" + err.Message, ToastMessageStyles.Warning);
            }


            //make the window responsive again
            mMainWindow.ToggleContainerControlsForBrowser(true);

            //no further navigation right now
            e.Cancel = true;
        }