add SimpleStrem(Request)Handler, for simple uripaths, any method or query
							parent
							
								
									e818c570bb
								
							
						
					
					
						commit
						0fe51f34c2
					
				| 
						 | 
					@ -618,24 +618,35 @@ namespace OpenSim.Framework.Servers.HttpServer
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                Culture.SetCurrentCulture();
 | 
					                Culture.SetCurrentCulture();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//                //  This is the REST agent interface. We require an agent to properly identify
 | 
					                //                //  This is the REST agent interface. We require an agent to properly identify
 | 
				
			||||||
//                //  itself. If the REST handler recognizes the prefix it will attempt to
 | 
					                //                //  itself. If the REST handler recognizes the prefix it will attempt to
 | 
				
			||||||
//                //  satisfy the request. If it is not recognizable, and no damage has occurred
 | 
					                //                //  satisfy the request. If it is not recognizable, and no damage has occurred
 | 
				
			||||||
//                //  the request can be passed through to the other handlers. This is a low
 | 
					                //                //  the request can be passed through to the other handlers. This is a low
 | 
				
			||||||
//                //  probability event; if a request is matched it is normally expected to be
 | 
					                //                //  probability event; if a request is matched it is normally expected to be
 | 
				
			||||||
//                //  handled
 | 
					                //                //  handled
 | 
				
			||||||
//                IHttpAgentHandler agentHandler;
 | 
					                //                IHttpAgentHandler agentHandler;
 | 
				
			||||||
//
 | 
					                //
 | 
				
			||||||
//                if (TryGetAgentHandler(request, response, out agentHandler))
 | 
					                //                if (TryGetAgentHandler(request, response, out agentHandler))
 | 
				
			||||||
//                {
 | 
					                //                {
 | 
				
			||||||
//                    if (HandleAgentRequest(agentHandler, request, response))
 | 
					                //                    if (HandleAgentRequest(agentHandler, request, response))
 | 
				
			||||||
//                    {
 | 
					                //                    {
 | 
				
			||||||
//                        requestEndTick = Environment.TickCount;
 | 
					                //                        requestEndTick = Environment.TickCount;
 | 
				
			||||||
//                        return;
 | 
					                //                        return;
 | 
				
			||||||
//                    }
 | 
					                //                    }
 | 
				
			||||||
//                }
 | 
					                //                }
 | 
				
			||||||
 | 
					                string path = request.UriPath;
 | 
				
			||||||
 | 
					                if (!string.IsNullOrWhiteSpace(path) && TryGetSimpleStreamHandler(path, out ISimpleStreamHandler hdr))
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    hdr.Handle(request, response);
 | 
				
			||||||
 | 
					                    if (request.InputStream != null && request.InputStream.CanRead)
 | 
				
			||||||
 | 
					                        request.InputStream.Dispose();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                string path = request.RawUrl;
 | 
					                    requestEndTick = Environment.TickCount;
 | 
				
			||||||
 | 
					                    response.Send();
 | 
				
			||||||
 | 
					                    return;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                path = request.RawUrl;
 | 
				
			||||||
                string handlerKey = GetHandlerKey(request.HttpMethod, path);
 | 
					                string handlerKey = GetHandlerKey(request.HttpMethod, path);
 | 
				
			||||||
                byte[] buffer = null;
 | 
					                byte[] buffer = null;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -88,4 +88,17 @@ namespace OpenSim.Framework.Servers.HttpServer
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        Hashtable Handle(string path, Hashtable request);
 | 
					        Hashtable Handle(string path, Hashtable request);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public interface ISimpleStreamHandler
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        string Name { get; }
 | 
				
			||||||
 | 
					        string Description { get; }
 | 
				
			||||||
 | 
					        string Path { get; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        int RequestsReceived { get; }
 | 
				
			||||||
 | 
					        int RequestsHandled { get; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Handle request stream, return byte array
 | 
				
			||||||
 | 
					        void Handle(IOSHttpRequest httpRequest, IOSHttpResponse httpResponse);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,89 @@
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Copyright (c) Contributors, http://opensimulator.org/
 | 
				
			||||||
 | 
					 * See CONTRIBUTORS.TXT for a full list of copyright holders.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Redistribution and use in source and binary forms, with or without
 | 
				
			||||||
 | 
					 * modification, are permitted provided that the following conditions are met:
 | 
				
			||||||
 | 
					 *     * Redistributions of source code must retain the above copyright
 | 
				
			||||||
 | 
					 *       notice, this list of conditions and the following disclaimer.
 | 
				
			||||||
 | 
					 *     * Redistributions in binary form must reproduce the above copyright
 | 
				
			||||||
 | 
					 *       notice, this list of conditions and the following disclaimer in the
 | 
				
			||||||
 | 
					 *       documentation and/or other materials provided with the distribution.
 | 
				
			||||||
 | 
					 *     * Neither the name of the OpenSimulator Project nor the
 | 
				
			||||||
 | 
					 *       names of its contributors may be used to endorse or promote products
 | 
				
			||||||
 | 
					 *       derived from this software without specific prior written permission.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
 | 
				
			||||||
 | 
					 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 | 
				
			||||||
 | 
					 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 | 
				
			||||||
 | 
					 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
 | 
				
			||||||
 | 
					 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 | 
				
			||||||
 | 
					 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 | 
				
			||||||
 | 
					 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 | 
				
			||||||
 | 
					 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
				
			||||||
 | 
					 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 | 
				
			||||||
 | 
					 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					using System;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace OpenSim.Framework.Servers.HttpServer
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    /// <summary>
 | 
				
			||||||
 | 
					    /// simple Base streamed request handler
 | 
				
			||||||
 | 
					    /// for well defined simple uri paths, any http method
 | 
				
			||||||
 | 
					    /// </summary>
 | 
				
			||||||
 | 
					    public abstract class SimpleBaseRequestHandler
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        public int RequestsReceived { get; protected set; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        public int RequestsHandled { get; protected set; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        private readonly string m_path;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        public string Name { get; private set; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        public string Description { get; private set; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        protected SimpleBaseRequestHandler(string path) : this(path, null, null) { }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        protected SimpleBaseRequestHandler(string path, string name, string description)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            Name = name;
 | 
				
			||||||
 | 
					            Description = description;
 | 
				
			||||||
 | 
					            m_path = path;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        public string Path
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            get { return m_path; }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        public string GetParam(string path)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            if (CheckParam(path))
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                return path.Substring(m_path.Length);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            return string.Empty;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        protected bool CheckParam(string path)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            if (string.IsNullOrEmpty(path))
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                return false;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            return path.StartsWith(Path);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        public string[] SplitParams(string path)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            string param = GetParam(path);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            return param.Split(new char[] { '/', '?', '&' }, StringSplitOptions.RemoveEmptyEntries);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,85 @@
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Copyright (c) Contributors, http://opensimulator.org/
 | 
				
			||||||
 | 
					 * See CONTRIBUTORS.TXT for a full list of copyright holders.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Redistribution and use in source and binary forms, with or without
 | 
				
			||||||
 | 
					 * modification, are permitted provided that the following conditions are met:
 | 
				
			||||||
 | 
					 *     * Redistributions of source code must retain the above copyright
 | 
				
			||||||
 | 
					 *       notice, this list of conditions and the following disclaimer.
 | 
				
			||||||
 | 
					 *     * Redistributions in binary form must reproduce the above copyright
 | 
				
			||||||
 | 
					 *       notice, this list of conditions and the following disclaimer in the
 | 
				
			||||||
 | 
					 *       documentation and/or other materials provided with the distribution.
 | 
				
			||||||
 | 
					 *     * Neither the name of the OpenSimulator Project nor the
 | 
				
			||||||
 | 
					 *       names of its contributors may be used to endorse or promote products
 | 
				
			||||||
 | 
					 *       derived from this software without specific prior written permission.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
 | 
				
			||||||
 | 
					 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 | 
				
			||||||
 | 
					 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 | 
				
			||||||
 | 
					 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
 | 
				
			||||||
 | 
					 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 | 
				
			||||||
 | 
					 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 | 
				
			||||||
 | 
					 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 | 
				
			||||||
 | 
					 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
				
			||||||
 | 
					 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 | 
				
			||||||
 | 
					 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					using System.IO;
 | 
				
			||||||
 | 
					using System.Net;
 | 
				
			||||||
 | 
					using OpenSim.Framework.ServiceAuth;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace OpenSim.Framework.Servers.HttpServer
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    /// <summary>
 | 
				
			||||||
 | 
					    /// simple Base streamed request handler.
 | 
				
			||||||
 | 
					    /// for well defined simple uri paths, any http method
 | 
				
			||||||
 | 
					    /// </summary>
 | 
				
			||||||
 | 
					    /// <remarks>
 | 
				
			||||||
 | 
					    /// Inheriting classes should override ProcessRequest() rather than Handle()
 | 
				
			||||||
 | 
					    /// </remarks>
 | 
				
			||||||
 | 
					    public abstract class SimpleStreamHandler : SimpleBaseRequestHandler, ISimpleStreamHandler
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        protected IServiceAuth m_Auth;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        protected SimpleStreamHandler(string path) : this(path, null, null) { }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        protected SimpleStreamHandler(string path, string name, string description)
 | 
				
			||||||
 | 
					            : base(path, name, description) { }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        protected SimpleStreamHandler(string path, IServiceAuth auth)
 | 
				
			||||||
 | 
					            : base(path, null, null)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            m_Auth = auth;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        protected SimpleStreamHandler(string path, IServiceAuth auth, string name, string description)
 | 
				
			||||||
 | 
					            : base(path, name, description)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            m_Auth = auth;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public virtual void Handle(IOSHttpRequest httpRequest, IOSHttpResponse httpResponse)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            RequestsReceived++;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (m_Auth != null)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                HttpStatusCode statusCode;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                if (!m_Auth.Authenticate(httpRequest.Headers, httpResponse.AddHeader, out statusCode))
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    httpResponse.StatusCode = (int)statusCode;
 | 
				
			||||||
 | 
					                    return;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            ProcessRequest(httpRequest, httpResponse);
 | 
				
			||||||
 | 
					            RequestsHandled++;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        protected virtual void ProcessRequest(IOSHttpRequest httpRequest, IOSHttpResponse httpResponse)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -186,6 +186,7 @@ namespace OpenSim.Tests.Common
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        public Uri Url { get; set; }
 | 
					        public Uri Url { get; set; }
 | 
				
			||||||
 | 
					        public string UriPath { get;}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        public string UserAgent
 | 
					        public string UserAgent
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue