diff options
Worked on Asset server, asset downloads (from server to sim) now work.
Asset uploads (from sim to server) may or may not work, needs more testing, if they don't work then it should be just a encoding problem and not hard to fix.
Diffstat (limited to 'OpenSim.Servers/BaseHttpServer.cs')
-rw-r--r-- | OpenSim.Servers/BaseHttpServer.cs | 167 |
1 files changed, 85 insertions, 82 deletions
diff --git a/OpenSim.Servers/BaseHttpServer.cs b/OpenSim.Servers/BaseHttpServer.cs index a14e5c3..38f4370 100644 --- a/OpenSim.Servers/BaseHttpServer.cs +++ b/OpenSim.Servers/BaseHttpServer.cs | |||
@@ -26,14 +26,14 @@ namespace OpenSim.Servers | |||
26 | { | 26 | { |
27 | get { return m_restMethod; } | 27 | get { return m_restMethod; } |
28 | } | 28 | } |
29 | 29 | ||
30 | public RestMethodEntry( string path, RestMethod restMethod ) | 30 | public RestMethodEntry(string path, RestMethod restMethod) |
31 | { | 31 | { |
32 | m_path = path; | 32 | m_path = path; |
33 | m_restMethod = restMethod; | 33 | m_restMethod = restMethod; |
34 | } | 34 | } |
35 | } | 35 | } |
36 | 36 | ||
37 | protected Thread m_workerThread; | 37 | protected Thread m_workerThread; |
38 | protected HttpListener m_httpListener; | 38 | protected HttpListener m_httpListener; |
39 | protected Dictionary<string, RestMethodEntry> m_restHandlers = new Dictionary<string, RestMethodEntry>(); | 39 | protected Dictionary<string, RestMethodEntry> m_restHandlers = new Dictionary<string, RestMethodEntry>(); |
@@ -48,10 +48,10 @@ namespace OpenSim.Servers | |||
48 | public bool AddRestHandler(string method, string path, RestMethod handler) | 48 | public bool AddRestHandler(string method, string path, RestMethod handler) |
49 | { | 49 | { |
50 | string methodKey = String.Format("{0}: {1}", method, path); | 50 | string methodKey = String.Format("{0}: {1}", method, path); |
51 | 51 | ||
52 | if (!this.m_restHandlers.ContainsKey(methodKey)) | 52 | if (!this.m_restHandlers.ContainsKey(methodKey)) |
53 | { | 53 | { |
54 | this.m_restHandlers.Add(methodKey, new RestMethodEntry( path, handler )); | 54 | this.m_restHandlers.Add(methodKey, new RestMethodEntry(path, handler)); |
55 | return true; | 55 | return true; |
56 | } | 56 | } |
57 | 57 | ||
@@ -74,9 +74,9 @@ namespace OpenSim.Servers | |||
74 | protected virtual string ProcessXMLRPCMethod(string methodName, XmlRpcRequest request) | 74 | protected virtual string ProcessXMLRPCMethod(string methodName, XmlRpcRequest request) |
75 | { | 75 | { |
76 | XmlRpcResponse response; | 76 | XmlRpcResponse response; |
77 | 77 | ||
78 | XmlRpcMethod method; | 78 | XmlRpcMethod method; |
79 | if( this.m_rpcHandlers.TryGetValue( methodName, out method ) ) | 79 | if (this.m_rpcHandlers.TryGetValue(methodName, out method)) |
80 | { | 80 | { |
81 | response = method(request); | 81 | response = method(request); |
82 | } | 82 | } |
@@ -96,15 +96,15 @@ namespace OpenSim.Servers | |||
96 | protected virtual string ParseREST(string request, string path, string method) | 96 | protected virtual string ParseREST(string request, string path, string method) |
97 | { | 97 | { |
98 | string response; | 98 | string response; |
99 | 99 | ||
100 | string requestKey = String.Format("{0}: {1}", method, path); | 100 | string requestKey = String.Format("{0}: {1}", method, path); |
101 | 101 | ||
102 | string bestMatch = String.Empty; | 102 | string bestMatch = String.Empty; |
103 | foreach( string currentKey in m_restHandlers.Keys ) | 103 | foreach (string currentKey in m_restHandlers.Keys) |
104 | { | 104 | { |
105 | if( requestKey.StartsWith( currentKey )) | 105 | if (requestKey.StartsWith(currentKey)) |
106 | { | 106 | { |
107 | if(currentKey.Length > bestMatch.Length ) | 107 | if (currentKey.Length > bestMatch.Length) |
108 | { | 108 | { |
109 | bestMatch = currentKey; | 109 | bestMatch = currentKey; |
110 | } | 110 | } |
@@ -116,9 +116,9 @@ namespace OpenSim.Servers | |||
116 | { | 116 | { |
117 | RestMethod restMethod = restMethodEntry.RestMethod; | 117 | RestMethod restMethod = restMethodEntry.RestMethod; |
118 | 118 | ||
119 | string param = path.Substring( restMethodEntry.Path.Length ); | 119 | string param = path.Substring(restMethodEntry.Path.Length); |
120 | response = restMethod(request, path, param); | 120 | response = restMethod(request, path, param); |
121 | 121 | ||
122 | } | 122 | } |
123 | else | 123 | else |
124 | { | 124 | { |
@@ -144,7 +144,7 @@ namespace OpenSim.Servers | |||
144 | 144 | ||
145 | string methodName = request.MethodName; | 145 | string methodName = request.MethodName; |
146 | 146 | ||
147 | responseString = ProcessXMLRPCMethod(methodName, request ); | 147 | responseString = ProcessXMLRPCMethod(methodName, request); |
148 | } | 148 | } |
149 | catch (Exception e) | 149 | catch (Exception e) |
150 | { | 150 | { |
@@ -155,83 +155,86 @@ namespace OpenSim.Servers | |||
155 | 155 | ||
156 | public virtual void HandleRequest(Object stateinfo) | 156 | public virtual void HandleRequest(Object stateinfo) |
157 | { | 157 | { |
158 | try { | 158 | try |
159 | HttpListenerContext context = (HttpListenerContext)stateinfo; | 159 | { |
160 | 160 | HttpListenerContext context = (HttpListenerContext)stateinfo; | |
161 | HttpListenerRequest request = context.Request; | 161 | |
162 | HttpListenerResponse response = context.Response; | 162 | HttpListenerRequest request = context.Request; |
163 | 163 | HttpListenerResponse response = context.Response; | |
164 | response.KeepAlive = false; | 164 | |
165 | response.SendChunked = false; | 165 | response.KeepAlive = false; |
166 | 166 | response.SendChunked = false; | |
167 | System.IO.Stream body = request.InputStream; | 167 | |
168 | System.Text.Encoding encoding = System.Text.Encoding.UTF8; | 168 | System.IO.Stream body = request.InputStream; |
169 | System.IO.StreamReader reader = new System.IO.StreamReader(body, encoding); | 169 | System.Text.Encoding encoding = System.Text.Encoding.UTF8; |
170 | 170 | System.IO.StreamReader reader = new System.IO.StreamReader(body, encoding); | |
171 | string requestBody = reader.ReadToEnd(); | 171 | |
172 | body.Close(); | 172 | string requestBody = reader.ReadToEnd(); |
173 | reader.Close(); | 173 | body.Close(); |
174 | 174 | reader.Close(); | |
175 | //Console.WriteLine(request.HttpMethod + " " + request.RawUrl + " Http/" + request.ProtocolVersion.ToString() + " content type: " + request.ContentType); | 175 | |
176 | //Console.WriteLine(requestBody); | 176 | //Console.WriteLine(request.HttpMethod + " " + request.RawUrl + " Http/" + request.ProtocolVersion.ToString() + " content type: " + request.ContentType); |
177 | 177 | //Console.WriteLine(requestBody); | |
178 | string responseString = ""; | 178 | |
179 | switch (request.ContentType) | 179 | string responseString = ""; |
180 | { | 180 | switch (request.ContentType) |
181 | case "text/xml": | 181 | { |
182 | // must be XML-RPC, so pass to the XML-RPC parser | 182 | case "text/xml": |
183 | 183 | // must be XML-RPC, so pass to the XML-RPC parser | |
184 | responseString = ParseXMLRPC(requestBody); | 184 | |
185 | responseString = Regex.Replace(responseString, "utf-16", "utf-8"); | 185 | responseString = ParseXMLRPC(requestBody); |
186 | 186 | responseString = Regex.Replace(responseString, "utf-16", "utf-8"); | |
187 | response.AddHeader("Content-type", "text/xml"); | 187 | |
188 | break; | 188 | response.AddHeader("Content-type", "text/xml"); |
189 | 189 | break; | |
190 | case "application/xml": | 190 | |
191 | // probably LLSD we hope, otherwise it should be ignored by the parser | 191 | case "application/xml": |
192 | responseString = ParseLLSDXML(requestBody); | 192 | // probably LLSD we hope, otherwise it should be ignored by the parser |
193 | response.AddHeader("Content-type", "application/xml"); | 193 | responseString = ParseLLSDXML(requestBody); |
194 | break; | 194 | response.AddHeader("Content-type", "application/xml"); |
195 | 195 | break; | |
196 | case "application/x-www-form-urlencoded": | 196 | |
197 | // a form data POST so send to the REST parser | 197 | case "application/x-www-form-urlencoded": |
198 | responseString = ParseREST(requestBody, request.RawUrl, request.HttpMethod); | 198 | // a form data POST so send to the REST parser |
199 | response.AddHeader("Content-type", "text/html"); | 199 | responseString = ParseREST(requestBody, request.RawUrl, request.HttpMethod); |
200 | break; | 200 | response.AddHeader("Content-type", "text/html"); |
201 | 201 | break; | |
202 | case null: | 202 | |
203 | // must be REST or invalid crap, so pass to the REST parser | 203 | case null: |
204 | responseString = ParseREST(requestBody, request.RawUrl, request.HttpMethod); | 204 | // must be REST or invalid crap, so pass to the REST parser |
205 | response.AddHeader("Content-type", "text/html"); | 205 | responseString = ParseREST(requestBody, request.RawUrl, request.HttpMethod); |
206 | break; | 206 | response.AddHeader("Content-type", "text/html"); |
207 | 207 | break; | |
208 | } | 208 | |
209 | 209 | } | |
210 | byte[] buffer = System.Text.Encoding.UTF8.GetBytes(responseString); | 210 | |
211 | System.IO.Stream output = response.OutputStream; | 211 | byte[] buffer = System.Text.Encoding.UTF8.GetBytes(responseString); |
212 | response.SendChunked = false; | 212 | System.IO.Stream output = response.OutputStream; |
213 | response.ContentLength64 = buffer.Length; | 213 | response.SendChunked = false; |
214 | output.Write(buffer, 0, buffer.Length); | 214 | response.ContentLength64 = buffer.Length; |
215 | output.Close(); | 215 | output.Write(buffer, 0, buffer.Length); |
216 | } catch (Exception e) { | 216 | output.Close(); |
217 | Console.WriteLine(e.ToString()); | 217 | } |
218 | } | 218 | catch (Exception e) |
219 | { | ||
220 | Console.WriteLine(e.ToString()); | ||
221 | } | ||
219 | } | 222 | } |
220 | 223 | ||
221 | public void Start() | 224 | public void Start() |
222 | { | 225 | { |
223 | OpenSim.Framework.Console.MainConsole.Instance.WriteLine(LogPriority.LOW,"BaseHttpServer.cs: Starting up HTTP Server"); | 226 | OpenSim.Framework.Console.MainConsole.Instance.WriteLine(LogPriority.LOW, "BaseHttpServer.cs: Starting up HTTP Server"); |
224 | 227 | ||
225 | m_workerThread = new Thread(new ThreadStart(StartHTTP)); | 228 | m_workerThread = new Thread(new ThreadStart(StartHTTP)); |
226 | m_workerThread.IsBackground = true; | 229 | m_workerThread.IsBackground = true; |
227 | m_workerThread.Start(); | 230 | m_workerThread.Start(); |
228 | } | 231 | } |
229 | 232 | ||
230 | private void StartHTTP() | 233 | private void StartHTTP() |
231 | { | 234 | { |
232 | try | 235 | try |
233 | { | 236 | { |
234 | OpenSim.Framework.Console.MainConsole.Instance.WriteLine(LogPriority.LOW,"BaseHttpServer.cs: StartHTTP() - Spawned main thread OK"); | 237 | OpenSim.Framework.Console.MainConsole.Instance.WriteLine(LogPriority.LOW, "BaseHttpServer.cs: StartHTTP() - Spawned main thread OK"); |
235 | m_httpListener = new HttpListener(); | 238 | m_httpListener = new HttpListener(); |
236 | 239 | ||
237 | m_httpListener.Prefixes.Add("http://+:" + m_port + "/"); | 240 | m_httpListener.Prefixes.Add("http://+:" + m_port + "/"); |
@@ -246,7 +249,7 @@ namespace OpenSim.Servers | |||
246 | } | 249 | } |
247 | catch (Exception e) | 250 | catch (Exception e) |
248 | { | 251 | { |
249 | OpenSim.Framework.Console.MainConsole.Instance.WriteLine(LogPriority.MEDIUM,e.Message); | 252 | OpenSim.Framework.Console.MainConsole.Instance.WriteLine(LogPriority.MEDIUM, e.Message); |
250 | } | 253 | } |
251 | } | 254 | } |
252 | } | 255 | } |