Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

Added Rack Http Handler and refactored IronRuntime initialization

  • Loading branch information...
commit 05afbc1946fad9c35a7c3af0e69e72737e5916e9 1 parent ee9b492
@kmees kmees authored
Showing with 273 additions and 162 deletions.
  1. +0 −1  src/IronSharePoint.Framework/Hives/DirectoryHive.cs
  2. +25 −69 src/IronSharePoint.Framework/IronRuntime.cs
  3. +11 −7 src/IronSharePoint.Framework/IronSharePoint.Framework.csproj
  4. +28 −0 src/IronSharePoint.Framework/RackHttpHandler.cs
  5. +15 −17 src/IronSharePoint/Features/IronSP_WebApp/IronSP_WebApp.EventReceiver.cs
  6. +11 −24 src/IronSharePoint/TEMPLATE/Features/IronSP_Root/iron_sharepoint.rb
  7. +5 −0 src/IronSharePoint/TEMPLATE/Features/IronSP_Root/iron_sharepoint/application.rb
  8. +16 −0 src/IronSharePoint/TEMPLATE/Features/IronSP_Root/iron_sharepoint/ext/log4r.rb
  9. +8 −0 src/IronSharePoint/TEMPLATE/Features/IronSP_Root/iron_sharepoint/ext/rack.rb
  10. +86 −0 src/IronSharePoint/TEMPLATE/Features/IronSP_Root/iron_sharepoint/ext/rack/handlers/iis.rb
  11. +7 −7 src/IronSharePoint/TEMPLATE/Features/IronSP_Root/iron_sharepoint/file_stat.rb
  12. +9 −0 src/IronSharePoint/TEMPLATE/Features/IronSP_Root/iron_sharepoint/hives/directory_hive.rb
  13. +10 −0 src/IronSharePoint/TEMPLATE/Features/IronSP_Root/iron_sharepoint/hives/hive_composite.rb
  14. +13 −36 src/IronSharePoint/TEMPLATE/Features/IronSP_Root/iron_sharepoint/hives/sp_document_hive.rb
  15. +9 −0 src/IronSharePoint/TEMPLATE/Features/IronSP_Root/iron_sharepoint/hives/system_hive.rb
  16. +1 −1  src/IronSharePoint/TEMPLATE/Features/IronSP_Root/iron_sharepoint/main_http_handler.rb
  17. +15 −0 src/IronSharePoint/TEMPLATE/Features/IronSP_Root/iron_sharepoint/patches/hike/index.rb
  18. +4 −0 src/IronSharePoint/TEMPLATE/Features/IronSP_Root/iron_sharepoint/patches/log4r/logger.rb
View
1  src/IronSharePoint.Framework/Hives/DirectoryHive.cs
@@ -38,7 +38,6 @@ public bool DirectoryExists(string path)
{
var fullPath = GetFullPath(path);
- Console.WriteLine(fullPath);
return Directory.Exists(fullPath);
}
View
94 src/IronSharePoint.Framework/IronRuntime.cs
@@ -21,8 +21,6 @@ public class IronRuntime : IDisposable
private readonly Guid _siteId;
private readonly Guid _id;
- private IronConsole.IronConsole _console;
- private ScriptRuntime _scriptRuntime;
private IronRuntime(Guid siteId)
{
@@ -31,9 +29,9 @@ private IronRuntime(Guid siteId)
DynamicTypeRegistry = new Dictionary<string, Object>();
DynamicFunctionRegistry = new Dictionary<string, Object>();
- Engines = new Dictionary<string, IronEngine>();
- Initialize();
+ CreateScriptRuntime();
+ Console = new IronConsole(ScriptRuntime);
}
internal static Dictionary<Guid, IronRuntime> LivingRuntimes
@@ -41,25 +39,22 @@ private IronRuntime(Guid siteId)
get { return _staticLivingRuntimes; }
}
- internal Dictionary<String, IronEngine> Engines { get; private set; }
+ public IronConsole Console { get; private set; }
+ public ScriptRuntime ScriptRuntime { get; private set; }
- public IronConsole.IronConsole IronConsole
+ public IronScriptHost ScripHost
{
- get
- {
- return _console ??
- (_console = IronSharePoint.IronConsole.IronConsole.GetConsoleForRuntime(this));
- }
+ get { return (IronScriptHost) ScriptRuntime.Host; }
}
- public ScriptRuntime ScriptRuntime
+ public IronPlatformAdaptationLayer PlatformAdaptationLayer
{
- get { return _scriptRuntime; }
+ get { return ScripHost.IronPlatformAdaptationLayer; }
}
- public IronScriptHost ScripHost
+ public ScriptEngine RubyEngine
{
- get { return (IronScriptHost) ScriptRuntime.Host; }
+ get { return ScriptRuntime.GetEngine(IronConstant.RubyLanguageName); }
}
public IHive Hive
@@ -115,25 +110,19 @@ public void Dispose()
if (!IsDisposed)
{
IsDisposed = true;
- if (_console != null)
- {
- _console.Dispose();
- _console = null;
- }
ScripHost.Dispose();
-
LivingRuntimes.Remove(_siteId);
}
}
#endregion
- private void Initialize()
+ private void CreateScriptRuntime()
{
var setup = new ScriptRuntimeSetup();
var languageSetup = new LanguageSetup(
"IronRuby.Runtime.RubyContext, IronRuby, Version=1.1.3.0, Culture=neutral, PublicKeyToken=7f709c5b713576e1",
- IronConstant.IronRubyLanguageName,
+ IronConstant.RubyLanguageName,
new[] {"IronRuby", "Ruby", "rb"},
new[] {".rb"});
setup.LanguageSetups.Add(languageSetup);
@@ -141,18 +130,21 @@ private void Initialize()
setup.HostArguments = new object[] {_siteId};
setup.DebugMode = IronConstant.IronEnv == IronEnvironment.Debug;
- _scriptRuntime = new ScriptRuntime(setup);
+ ScriptRuntime = new ScriptRuntime(setup);
+ ScriptRuntime.LoadAssembly(typeof (IronRuntime).Assembly); // IronSharePoint
+ ScriptRuntime.LoadAssembly(typeof (SPSite).Assembly); // Microsoft.SharePoint
+ ScriptRuntime.LoadAssembly(typeof (IHttpHandler).Assembly); // System.Web
- _scriptRuntime.LoadAssembly(typeof (IronRuntime).Assembly); // IronSharePoint
- _scriptRuntime.LoadAssembly(typeof (SPSite).Assembly); // Microsoft.SharePoint
- _scriptRuntime.LoadAssembly(typeof (IHttpHandler).Assembly); // System.Web
+ InitializeScriptEngines();
+ }
- using (new SPMonitoredScope("Creating IronEngine(s)"))
+ private void InitializeScriptEngines()
+ {
+ using (new SPMonitoredScope("Initializing IronEngine(s)"))
{
SPSecurity.RunWithElevatedPrivileges(PrivilegedInitialize);
- ScriptEngine rubyEngine = _scriptRuntime.GetEngineByFileExtension(".rb");
- rubyEngine.SetSearchPaths(new List<String>
+ RubyEngine.SetSearchPaths(new List<String>
{
Path.Combine(IronConstant.IronRubyRootDirectory, @"ironruby"),
Path.Combine(IronConstant.IronRubyRootDirectory, @"ruby\1.9.1"),
@@ -160,32 +152,11 @@ private void Initialize()
Path.Combine(IronConstant.IronRubyRootDirectory, @"ruby\site_ruby\1.9.1")
});
- var ironRubyEngine = new IronEngine(this, rubyEngine);
- Engines[".rb"] = ironRubyEngine;
- ScriptScope scope = rubyEngine.CreateScope();
+ ScriptScope scope = RubyEngine.CreateScope();
scope.SetVariable("iron_runtime", this);
- scope.SetVariable("ruby_engine", ironRubyEngine);
- scope.SetVariable("iron_root", IronConstant.IronRubyRootDirectory);
- scope.SetVariable("iron_env",
- IronConstant.IronEnv == IronEnvironment.Debug
- ? "development"
- : IronConstant.IronEnv.ToString().ToLower());
- rubyEngine.Execute(
- "$RUNTIME = iron_runtime; " +
- "RUBY_ENGINE = ruby_engine;" +
- "IRON_ROOT = RAILS_ROOT = iron_root;" +
- "IRON_ENV = RAILS_ENV = iron_env",
- scope);
- rubyEngine.Execute(@"
-require 'rubygems'
-
-begin
- require 'iron_sharepoint'
- require 'application'
-rescue Exception => ex
- IRON_DEFAULT_LOGGER.error ex
-end");
+ RubyEngine.Execute("$RUNTIME = iron_runtime", scope);
+ RubyEngine.Execute(@"require 'rubygems'; #require 'application'");
}
}
@@ -238,21 +209,6 @@ private static bool TryGetExistingRuntime(Guid targetId, out IronRuntime runtime
return runtime != null;
}
- public IronEngine GetEngineByExtension(string extension)
- {
- IronEngine ironEngine = null;
-
- if (!Engines.TryGetValue(extension, out ironEngine))
- {
- string error = String.Format("Error occured while getting engine for extension {0}", extension);
- var ex = new ArgumentException(error, "extension");
- LogError(error, ex);
- throw ex;
- }
-
- return ironEngine;
- }
-
public void RegisterDynamicType(string name, object type)
{
if (!DynamicTypeRegistry.ContainsKey(name))
View
18 src/IronSharePoint.Framework/IronSharePoint.Framework.csproj
@@ -107,18 +107,16 @@
<Compile Include="IIronControl.cs" />
<Compile Include="IIronDataStore.cs" />
<Compile Include="IronCompositeControl.cs" />
- <Compile Include="IronConsole\Hooks\IIronConsoleHook.cs" />
- <Compile Include="IronConsole\Hooks\IronConsoleHookBase.cs" />
- <Compile Include="IronConsole\Hooks\RubyConsoleHook.cs" />
- <Compile Include="IronConsole\IronConsole.cs" />
- <Compile Include="IronConsole\IronConsoleResult.cs" />
- <Compile Include="IronConsole\IronConsoleTask.cs" />
+ <Compile Include="Console\Hooks\IHook.cs" />
+ <Compile Include="Console\Hooks\HookBase.cs" />
+ <Compile Include="Console\Hooks\RubyHook.cs" />
+ <Compile Include="IronConsole.cs" />
+ <Compile Include="Console\ScriptResult.cs" />
<Compile Include="IronConstant.cs" />
<Compile Include="IronContentTypeId.cs" />
<Compile Include="IronControl.cs" />
<Compile Include="IronEngine.cs" />
<Compile Include="IronEnvironment.cs" />
- <Compile Include="IronExpressionBuilder.cs" />
<Compile Include="FieldHelper.cs" />
<Compile Include="IronHttpHandler.cs" />
<Compile Include="IronHttpModule.cs" />
@@ -131,9 +129,11 @@
<SubType>ASPXCodeBehind</SubType>
</Compile>
<Compile Include="Properties\AssemblyInfo.cs" />
+ <Compile Include="RackHttpHandler.cs" />
<Compile Include="Util\BlockingQueue.cs" />
<Compile Include="Util\EnumerableExtensions.cs" />
<Compile Include="Util\IBlockingQueue.cs" />
+ <Compile Include="Util\ScriptEngineExtensions.cs" />
<Compile Include="Util\StringExtensions.cs" />
</ItemGroup>
<ItemGroup>
@@ -142,6 +142,10 @@
</ItemGroup>
<ItemGroup />
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+ <PropertyGroup>
+ <PostBuildEvent>
+ </PostBuildEvent>
+ </PropertyGroup>
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
View
28 src/IronSharePoint.Framework/RackHttpHandler.cs
@@ -0,0 +1,28 @@
+using System;
+using System.Collections.Generic;
+using System.Dynamic;
+using System.IO;
+using System.Linq;
+using System.Text;
+using System.Text.RegularExpressions;
+using System.Threading.Tasks;
+using System.Web;
+using Microsoft.SharePoint;
+
+namespace IronSharePoint
+{
+ class RackHttpHandler : IHttpHandler
+ {
+ public void ProcessRequest(HttpContext ctx)
+ {
+ var ironRuntime = IronRuntime.GetDefaultIronRuntime(SPContext.Current.Site);
+ var rubyEngine = ironRuntime.RubyEngine;
+
+ var scope = rubyEngine.CreateScope();
+ scope.SetVariable("ctx", ctx);
+ rubyEngine.Execute("Rack::Handler::IIS.process(ctx)", scope);
+ }
+
+ public bool IsReusable { get { return true; } }
+ }
+}
View
32 src/IronSharePoint/Features/IronSP_WebApp/IronSP_WebApp.EventReceiver.cs
@@ -27,11 +27,8 @@ public override void FeatureActivated(SPFeatureReceiverProperties properties)
{
var webApp = properties.Feature.Parent as SPWebApplication;
- RegisterExpressionBuilder(webApp);
-
RegisterHttpModule(webApp);
-
- RegisterHttpHandlerFactory(webApp);
+ RegisterRackHttpHandler(webApp);
/*Call Update and ApplyWebConfigModifications to save changes*/
webApp.Update();
@@ -66,22 +63,23 @@ private static void RegisterHttpHandlerFactory(SPWebApplication webApp)
webApp.WebConfigModifications.Add(httpHandlerFacotry);
}
- private static void RegisterExpressionBuilder(SPWebApplication webApp)
+ private static void RegisterRackHttpHandler(SPWebApplication webApp)
{
- var expressionBuilderType = typeof(IronExpressionBuilder);
- SPWebConfigModification expressionBuilderMod = new SPWebConfigModification();
- expressionBuilderMod.Path = "configuration/system.web/compilation/expressionBuilders";
- expressionBuilderMod.Name = String.Format("add[@expressionPrefix='Iron'][@type='{0}']", expressionBuilderType.AssemblyQualifiedName);
- expressionBuilderMod.Sequence = 0;
- expressionBuilderMod.Owner = modificationOwner;
- expressionBuilderMod.Type = SPWebConfigModification.SPWebConfigModificationType.EnsureChildNode;
- expressionBuilderMod.Value = String.Format("<add expressionPrefix='Iron' type='{0}' />", expressionBuilderType.AssemblyQualifiedName);
- webApp.WebConfigModifications.Add(expressionBuilderMod);
+ var httpHandlerType = typeof(RackHttpHandler);
+ var mod = new SPWebConfigModification
+ {
+ Path = "configuration/system.webServer/handlers",
+ Name = String.Format("add[@type='{0}']", httpHandlerType.AssemblyQualifiedName),
+ Sequence = 0,
+ Owner = modificationOwner,
+ Type = SPWebConfigModification.SPWebConfigModificationType.EnsureChildNode,
+ Value =
+ String.Format("<add name='RackHttpHandler' path='_iron/*' verb='GET' type='{0}' />",
+ httpHandlerType.AssemblyQualifiedName)
+ };
+ webApp.WebConfigModifications.Add(mod);
}
-
- // Uncomment the method below to handle the event raised before a feature is deactivated.
-
public override void FeatureDeactivating(SPFeatureReceiverProperties properties)
{
SPSecurity.RunWithElevatedPrivileges(() => {
View
35 src/IronSharePoint/TEMPLATE/Features/IronSP_Root/iron_sharepoint.rb
@@ -1,27 +1,14 @@
require 'active_support/core_ext'
-require 'log4r'
-require 'haml'
-require 'slim'
-require 'tilt'
-require 'iron_sharepoint/ext/log4r/outputter/iron_logs_outputter'
-require 'iron_sharepoint/ext/log4r/outputter/iron_memory_outputter'
-
-formatter = Log4r::PatternFormatter.new(:pattern => "[%l] %d - %c@%t :: %M")
-
-default_log = Log4r::Logger.new "default"
-default_log.outputters << (Log4r::IronLogsOutputter.new "iron_logs", $RUNTIME, :formatter => formatter, :level => Log4r::WARN)
-default_log.outputters << (Log4r::IronMemoryOutputter.new "iron_default", $RUNTIME, :formatter => formatter)
-
-internal_log = Log4r::Logger.new "log4r"
-internal_log.outputters << (Log4r::IronMemoryOutputter.new "iron_internal", $RUNTIME, :formatter => formatter)
-
-IRON_INTERNAL_LOGGER = internal_log
-IRON_DEFAULT_LOGGER = default_log
-
-Dir["iron_sharepoint/**/*.rb"].each do |file|
- begin
- require file
- rescue Exception => ex
- IRON_DEFAULT_LOGGER.error ex
+require 'iron_sharepoint/ext/log4r'
+require 'iron_sharepoint/ext/rack'
+
+module IronSharePoint
+ Dir["iron_sharepoint/**/*.rb"].each do |file|
+ begin
+ require file
+ rescue Exception => ex
+ DEFAULT_LOGGER.error ex
+ end
end
end
+
View
5 src/IronSharePoint/TEMPLATE/Features/IronSP_Root/iron_sharepoint/application.rb
@@ -0,0 +1,5 @@
+module IronSharePoint
+ class Application
+
+ end
+end
View
16 src/IronSharePoint/TEMPLATE/Features/IronSP_Root/iron_sharepoint/ext/log4r.rb
@@ -0,0 +1,16 @@
+require 'log4r'
+require 'iron_sharepoint/ext/log4r/outputter/iron_logs_outputter'
+require 'iron_sharepoint/ext/log4r/outputter/iron_memory_outputter'
+
+formatter = Log4r::PatternFormatter.new(:pattern => "[%l] %d - %c@%t :: %M")
+
+default_log = Log4r::Logger.new "default"
+default_log.outputters << (Log4r::IronLogsOutputter.new "iron_logs", $RUNTIME, :formatter => formatter, :level => Log4r::WARN)
+default_log.outputters << (Log4r::IronMemoryOutputter.new "iron_default", $RUNTIME, :formatter => formatter)
+
+internal_log = Log4r::Logger.new "log4r"
+internal_log.outputters << (Log4r::IronMemoryOutputter.new "iron_internal", $RUNTIME, :formatter => formatter)
+
+::IronSharePoint::INTERNAL_LOGGER = IRON_INTERNAL_LOGGER = internal_log
+::IronSharePoint::DEFAULT_LOGGER = IRON_DEFAULT_LOGGER = default_log
+
View
8 src/IronSharePoint/TEMPLATE/Features/IronSP_Root/iron_sharepoint/ext/rack.rb
@@ -0,0 +1,8 @@
+require 'rack'
+
+module Rack
+ module Handlers
+ autoload :IIS, 'iron_sharepoint/ext/rack/handlers/iis'
+ end
+end
+
View
86 src/IronSharePoint/TEMPLATE/Features/IronSP_Root/iron_sharepoint/ext/rack/handlers/iis.rb
@@ -0,0 +1,86 @@
+require 'rack'
+
+module Rack
+ module Handlers
+ class IIS
+ attr_reader :app, :started
+
+ alias_method :started?, :started
+
+ def self.run app, options = {}
+ @server = self.new app
+ @server.start
+ end
+
+ def initialize app
+ @app = app
+ end
+
+ def process ctx
+ if started?
+ req = ctx.request
+ res = ctx.response
+
+ env = build_env req
+
+ result = @app.call env
+
+ write_response res, *result
+ else
+ res.status_code = 404
+ res.write "Not started"
+ end
+ end
+
+ def start
+ @started = true
+ end
+
+ def shutdown
+ @started = false
+ end
+
+ private
+
+ def build_env req
+ env = {
+ "rack.errors" => ::IronSharePoint::DEFAULT_LOGGER,
+ "rack.multithread" => true,
+ "rack.multiprocess" => false,
+ "rack.run_once" => false,
+ "rack.url_scheme" => req.url.scheme.downcase,
+ "rack.input" => read_body(req)
+ }
+
+ req.server_variables.all_keys.each do |key|
+ env[key] = trim_iron(req.server_variables[key])
+ end
+
+ return env
+ end
+
+ def read_body req
+ using(System::IO::StreamReader.new req.input_stream) do |reader|
+ reader.read_to_end
+ end
+ end
+
+ def write_response res, status, headers, body
+ res.status_code = status
+ headers.each{|k,v| res.headers[k] = v}
+ if body.respond_to? :to_str
+ res.write body.to_str
+ elsif body.respond_to?(:each)
+ body.each do |part|
+ res.write part.to_s
+ end
+ end
+ end
+
+ def trim_iron(s)
+ match = /_iron(\/.*)$/.match s
+ match.nil? ? s : match[1]
+ end
+ end
+ end
+end
View
14 src/IronSharePoint/TEMPLATE/Features/IronSP_Root/iron_sharepoint/file_stat.rb
@@ -1,13 +1,13 @@
module IronSharePoint
class FileStat
attr_accessor :mtime, :size, :is_file
-
- def file?
- self.is_file
+
+ def file?
+ self.is_file
end
- def directory?
- !self.is_file
- end
+ def directory?
+ !self.is_file
+ end
end
-end
+end
View
9 src/IronSharePoint/TEMPLATE/Features/IronSP_Root/iron_sharepoint/hives/directory_hive.rb
@@ -0,0 +1,9 @@
+module IronSharePoint::Hives
+ class DirectoryHive
+ def file_stat path
+ path = get_full_path path
+ return File::Stat.new path
+ end
+ end
+end
+
View
10 src/IronSharePoint/TEMPLATE/Features/IronSP_Root/iron_sharepoint/hives/hive_composite.rb
@@ -0,0 +1,10 @@
+module IronSharePoint::Hives
+ class HiveComposite
+ def file_stat path
+ handler = find_handler path
+ return nil if handler.nil?
+ handler.file_stat path
+ end
+ end
+end
+
View
49 src/IronSharePoint/TEMPLATE/Features/IronSP_Root/iron_sharepoint/hives/sp_document_hive.rb
@@ -3,42 +3,19 @@
module IronSharePoint::Hives
class SPDocumentHive
def file_stat path
- path = get_partial_path path
- if file_exists path
- listItem = get_sp_list_item path
- return nil if listItem.nil?
+ path = get_partial_path path
+ if file_exists path
+ listItem = get_sp_list_item path
+ return nil if listItem.nil?
- stat = IronSharePoint::FileStat.new
- stat.mtime = listItem["Modified"]
- stat.size = listItem["File_x0020_Size"].to_i
- stat.is_file = true
- return stat
- else
- return nil
- end
- end
- end
-
- class DirectoryHive
- def file_stat path
- path = get_full_path path
- return File::Stat.new path
- end
- end
-
- class SystemHive
- def file_stat path
- path = get_full_path path
- return File::Stat.new path
- end
- end
-
- class HiveComposite
- def file_stat path
- handler = find_handler path
- return nil if handler.nil?
- handler.file_stat path
- end
+ stat = IronSharePoint::FileStat.new
+ stat.mtime = listItem["Modified"]
+ stat.size = listItem["File_x0020_Size"].to_i
+ stat.is_file = true
+ return stat
+ else
+ return nil
+ end
+ end
end
end
-
View
9 src/IronSharePoint/TEMPLATE/Features/IronSP_Root/iron_sharepoint/hives/system_hive.rb
@@ -0,0 +1,9 @@
+module IronSharePoint::Hives
+ class SystemHive
+ def file_stat path
+ path = get_full_path path
+ return File::Stat.new path
+ end
+ end
+end
+
View
2  src/IronSharePoint/TEMPLATE/Features/IronSP_Root/iron_sharepoint/main_http_handler.rb
@@ -17,7 +17,7 @@ def IsReusable
def ProcessRequest(context)
path = context.Request.Path
- _, handler = IronSharePoint::HttpHandlers.routes.select {|k,v| k.match(path) }.last
+ _, handler = IronSharePoint::HttpHandlers.routes.select {|k,v| k.match(path) }.to_a.last
unless handler.nil?
handler.new.ProcessRequest(context)
View
15 src/IronSharePoint/TEMPLATE/Features/IronSP_Root/iron_sharepoint/patches/hike/index.rb
@@ -0,0 +1,15 @@
+require 'hike/index'
+require 'iron_sharepoint/file_stat'
+
+module Hike
+ class Index
+ def stat path
+ path = trim(path)
+ $RUNTIME.hive.file_stat path
+ end
+
+ def trim path
+ $RUNTIME.platform_adaption_layer.trim_path(path).to_s
+ end
+ end
+end
View
4 src/IronSharePoint/TEMPLATE/Features/IronSP_Root/iron_sharepoint/patches/log4r/logger.rb
@@ -3,5 +3,9 @@ class Logger
def inspect
self.to_s
end
+
+ def flush
+ @outputters.each{|x| x.flush}
+ end
end
end
Please sign in to comment.
Something went wrong with that request. Please try again.