aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Framework/Servers/BaseHttpServer.cs
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Framework/Servers/BaseHttpServer.cs')
-rw-r--r--OpenSim/Framework/Servers/BaseHttpServer.cs122
1 files changed, 67 insertions, 55 deletions
diff --git a/OpenSim/Framework/Servers/BaseHttpServer.cs b/OpenSim/Framework/Servers/BaseHttpServer.cs
index 0f6d79b..289b122 100644
--- a/OpenSim/Framework/Servers/BaseHttpServer.cs
+++ b/OpenSim/Framework/Servers/BaseHttpServer.cs
@@ -123,73 +123,85 @@ namespace OpenSim.Framework.Servers
123 return true; 123 return true;
124 } 124 }
125 125
126 /// <summary>
127 /// Handle an individual http request. This method is given to a worker in the thread pool.
128 /// </summary>
129 /// <param name="stateinfo"></param>
126 public virtual void HandleRequest(Object stateinfo) 130 public virtual void HandleRequest(Object stateinfo)
127 { 131 {
128 HttpListenerContext context = (HttpListenerContext) stateinfo; 132 // If we don't catch the exception here it will just disappear into the thread pool and we'll be none the wiser
129 133 try
130 HttpListenerRequest request = context.Request;
131 HttpListenerResponse response = context.Response;
132
133 response.KeepAlive = false;
134 response.SendChunked = false;
135
136 string path = request.RawUrl;
137 string handlerKey = GetHandlerKey(request.HttpMethod, path);
138
139 IRequestHandler requestHandler;
140
141 if (TryGetStreamHandler(handlerKey, out requestHandler))
142 { 134 {
143 // Okay, so this is bad, but should be considered temporary until everything is IStreamHandler. 135 HttpListenerContext context = (HttpListenerContext) stateinfo;
144 byte[] buffer; 136
145 if (requestHandler is IStreamedRequestHandler) 137 HttpListenerRequest request = context.Request;
138 HttpListenerResponse response = context.Response;
139
140 response.KeepAlive = false;
141 response.SendChunked = false;
142
143 string path = request.RawUrl;
144 string handlerKey = GetHandlerKey(request.HttpMethod, path);
145
146 IRequestHandler requestHandler;
147
148 if (TryGetStreamHandler(handlerKey, out requestHandler))
146 { 149 {
147 IStreamedRequestHandler streamedRequestHandler = requestHandler as IStreamedRequestHandler; 150 // Okay, so this is bad, but should be considered temporary until everything is IStreamHandler.
148 buffer = streamedRequestHandler.Handle(path, request.InputStream); 151 byte[] buffer;
152 if (requestHandler is IStreamedRequestHandler)
153 {
154 IStreamedRequestHandler streamedRequestHandler = requestHandler as IStreamedRequestHandler;
155 buffer = streamedRequestHandler.Handle(path, request.InputStream);
156 }
157 else
158 {
159 IStreamHandler streamHandler = (IStreamHandler) requestHandler;
160
161 using (MemoryStream memoryStream = new MemoryStream())
162 {
163 streamHandler.Handle(path, request.InputStream, memoryStream);
164 memoryStream.Flush();
165 buffer = memoryStream.ToArray();
166 }
167 }
168
169 request.InputStream.Close();
170 response.ContentType = requestHandler.ContentType;
171 response.ContentLength64 = buffer.LongLength;
172
173 try
174 {
175 response.OutputStream.Write(buffer, 0, buffer.Length);
176 response.OutputStream.Close();
177 }
178 catch (HttpListenerException)
179 {
180 m_log.InfoFormat("[BASE HTTP SERVER] Http request abnormally terminated.");
181 }
149 } 182 }
150 else 183 else
151 { 184 {
152 IStreamHandler streamHandler = (IStreamHandler) requestHandler; 185 switch (request.ContentType)
153
154 using (MemoryStream memoryStream = new MemoryStream())
155 { 186 {
156 streamHandler.Handle(path, request.InputStream, memoryStream); 187 case null:
157 memoryStream.Flush(); 188 case "text/html":
158 buffer = memoryStream.ToArray(); 189 HandleHTTPRequest(request, response);
190 break;
191 case "application/xml+llsd":
192 HandleLLSDRequests(request, response);
193 break;
194 case "text/xml":
195 case "application/xml":
196 default:
197 HandleXmlRpcRequests(request, response);
198 break;
159 } 199 }
160 } 200 }
161
162 request.InputStream.Close();
163 response.ContentType = requestHandler.ContentType;
164 response.ContentLength64 = buffer.LongLength;
165
166 try
167 {
168 response.OutputStream.Write(buffer, 0, buffer.Length);
169 response.OutputStream.Close();
170 }
171 catch (HttpListenerException)
172 {
173 m_log.InfoFormat("[BASEHTTPSERVER] Http request abnormally terminated.");
174 }
175 } 201 }
176 else 202 catch (Exception e)
177 { 203 {
178 switch (request.ContentType) 204 m_log.ErrorFormat("[BASE HTTP SERVER]: HandleRequest() threw {0}", e);
179 {
180 case null:
181 case "text/html":
182 HandleHTTPRequest(request, response);
183 break;
184 case "application/xml+llsd":
185 HandleLLSDRequests(request, response);
186 break;
187 case "text/xml":
188 case "application/xml":
189 default:
190 HandleXmlRpcRequests(request, response);
191 break;
192 }
193 } 205 }
194 } 206 }
195 207