diff options
author | Dr Scofield | 2008-10-06 21:59:43 +0000 |
---|---|---|
committer | Dr Scofield | 2008-10-06 21:59:43 +0000 |
commit | ad04626737c164138d6d15d5e06eb20ff5b5f859 (patch) | |
tree | 6bc3aeb5dbb645503fcedb4012e68f069f8ada72 /OpenSim/Framework/Servers | |
parent | oops. forgot testcase (diff) | |
download | opensim-SC-ad04626737c164138d6d15d5e06eb20ff5b5f859.zip opensim-SC-ad04626737c164138d6d15d5e06eb20ff5b5f859.tar.gz opensim-SC-ad04626737c164138d6d15d5e06eb20ff5b5f859.tar.bz2 opensim-SC-ad04626737c164138d6d15d5e06eb20ff5b5f859.tar.xz |
cleaning up OSHttpResponse: note that read access to extra header
fields is GONE (HttpServer does not support that), you can read the
"normal" HTTP headers available via properties, and you can add
headers. also, it is now possible to set a timeout for KeepAlive (for
those clients that pay attention to it).
this also fixes the broken REST inventory/assets/appearance services,
they should be working again.
testcase for OSHttpResponse will follow.
Diffstat (limited to 'OpenSim/Framework/Servers')
-rw-r--r-- | OpenSim/Framework/Servers/BaseHttpServer.cs | 9 | ||||
-rw-r--r-- | OpenSim/Framework/Servers/OSHttpRequest.cs | 20 | ||||
-rw-r--r-- | OpenSim/Framework/Servers/OSHttpResponse.cs | 200 |
3 files changed, 69 insertions, 160 deletions
diff --git a/OpenSim/Framework/Servers/BaseHttpServer.cs b/OpenSim/Framework/Servers/BaseHttpServer.cs index d1c22d6..558b383 100644 --- a/OpenSim/Framework/Servers/BaseHttpServer.cs +++ b/OpenSim/Framework/Servers/BaseHttpServer.cs | |||
@@ -277,7 +277,7 @@ namespace OpenSim.Framework.Servers | |||
277 | } | 277 | } |
278 | 278 | ||
279 | IRequestHandler requestHandler; | 279 | IRequestHandler requestHandler; |
280 | response.KeepAlive = false; | 280 | response.KeepAlive = true; |
281 | response.SendChunked = false; | 281 | response.SendChunked = false; |
282 | 282 | ||
283 | string path = request.RawUrl; | 283 | string path = request.RawUrl; |
@@ -634,7 +634,7 @@ namespace OpenSim.Framework.Servers | |||
634 | requestStream.Close(); | 634 | requestStream.Close(); |
635 | 635 | ||
636 | //m_log.DebugFormat("[OGP]: {0}:{1}", request.RawUrl, requestBody); | 636 | //m_log.DebugFormat("[OGP]: {0}:{1}", request.RawUrl, requestBody); |
637 | response.KeepAlive = false; | 637 | response.KeepAlive = true; |
638 | 638 | ||
639 | LLSD llsdRequest = null; | 639 | LLSD llsdRequest = null; |
640 | LLSD llsdResponse = null; | 640 | LLSD llsdResponse = null; |
@@ -705,7 +705,7 @@ namespace OpenSim.Framework.Servers | |||
705 | response.SendChunked = false; | 705 | response.SendChunked = false; |
706 | response.ContentLength64 = buffer.Length; | 706 | response.ContentLength64 = buffer.Length; |
707 | response.ContentEncoding = Encoding.UTF8; | 707 | response.ContentEncoding = Encoding.UTF8; |
708 | response.KeepAlive = false; | 708 | response.KeepAlive = true; |
709 | 709 | ||
710 | try | 710 | try |
711 | { | 711 | { |
@@ -928,7 +928,7 @@ namespace OpenSim.Framework.Servers | |||
928 | { | 928 | { |
929 | m_log.Warn("[HTTP-AGENT]: Error - " + e.Message); | 929 | m_log.Warn("[HTTP-AGENT]: Error - " + e.Message); |
930 | response.SendChunked = false; | 930 | response.SendChunked = false; |
931 | response.KeepAlive = false; | 931 | response.KeepAlive = true; |
932 | response.StatusCode = (int)OSHttpStatusCode.ServerErrorInternalError; | 932 | response.StatusCode = (int)OSHttpStatusCode.ServerErrorInternalError; |
933 | //response.OutputStream.Close(); | 933 | //response.OutputStream.Close(); |
934 | try | 934 | try |
@@ -1128,6 +1128,7 @@ namespace OpenSim.Framework.Servers | |||
1128 | int responsecode = (int)responsedata["int_response_code"]; | 1128 | int responsecode = (int)responsedata["int_response_code"]; |
1129 | string responseString = (string)responsedata["str_response_string"]; | 1129 | string responseString = (string)responsedata["str_response_string"]; |
1130 | string contentType = (string)responsedata["content_type"]; | 1130 | string contentType = (string)responsedata["content_type"]; |
1131 | |||
1131 | if (responsedata.ContainsKey("error_status_text")) | 1132 | if (responsedata.ContainsKey("error_status_text")) |
1132 | { | 1133 | { |
1133 | response.StatusDescription = (string)responsedata["error_status_text"]; | 1134 | response.StatusDescription = (string)responsedata["error_status_text"]; |
diff --git a/OpenSim/Framework/Servers/OSHttpRequest.cs b/OpenSim/Framework/Servers/OSHttpRequest.cs index c47fe10..4c7d7ce 100644 --- a/OpenSim/Framework/Servers/OSHttpRequest.cs +++ b/OpenSim/Framework/Servers/OSHttpRequest.cs | |||
@@ -42,9 +42,8 @@ namespace OpenSim.Framework.Servers | |||
42 | { | 42 | { |
43 | private static readonly ILog _log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | 43 | private static readonly ILog _log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); |
44 | 44 | ||
45 | protected HttpServer.IHttpRequest _request = null; | 45 | protected IHttpRequest _request = null; |
46 | protected HttpServer.IHttpClientContext _context = null; | 46 | protected IHttpClientContext _context = null; |
47 | |||
48 | 47 | ||
49 | public string[] AcceptTypes | 48 | public string[] AcceptTypes |
50 | { | 49 | { |
@@ -137,8 +136,15 @@ namespace OpenSim.Framework.Servers | |||
137 | } | 136 | } |
138 | private string _userAgent; | 137 | private string _userAgent; |
139 | 138 | ||
139 | internal IHttpRequest IHttpRequest | ||
140 | { | ||
141 | get { return _request; } | ||
142 | } | ||
140 | 143 | ||
141 | 144 | internal IHttpClientContext IHttpClientContext | |
145 | { | ||
146 | get { return _context; } | ||
147 | } | ||
142 | 148 | ||
143 | /// <summary> | 149 | /// <summary> |
144 | /// Internal whiteboard for handlers to store temporary stuff | 150 | /// Internal whiteboard for handlers to store temporary stuff |
@@ -151,11 +157,9 @@ namespace OpenSim.Framework.Servers | |||
151 | private Dictionary<string, object> _whiteboard = new Dictionary<string, object>(); | 157 | private Dictionary<string, object> _whiteboard = new Dictionary<string, object>(); |
152 | 158 | ||
153 | 159 | ||
154 | public OSHttpRequest() | 160 | public OSHttpRequest() {} |
155 | { | ||
156 | } | ||
157 | 161 | ||
158 | public OSHttpRequest(HttpServer.IHttpClientContext context, HttpServer.IHttpRequest req) | 162 | public OSHttpRequest(IHttpClientContext context, IHttpRequest req) |
159 | { | 163 | { |
160 | _request = req; | 164 | _request = req; |
161 | _context = context; | 165 | _context = context; |
diff --git a/OpenSim/Framework/Servers/OSHttpResponse.cs b/OpenSim/Framework/Servers/OSHttpResponse.cs index 24bf340..6b20bf3 100644 --- a/OpenSim/Framework/Servers/OSHttpResponse.cs +++ b/OpenSim/Framework/Servers/OSHttpResponse.cs | |||
@@ -38,19 +38,8 @@ namespace OpenSim.Framework.Servers | |||
38 | /// OSHttpResponse is the OpenSim representation of an HTTP | 38 | /// OSHttpResponse is the OpenSim representation of an HTTP |
39 | /// response. | 39 | /// response. |
40 | /// </summary> | 40 | /// </summary> |
41 | /// <remarks> | ||
42 | /// OSHttpResponse is currently dual "homed" in that it support | ||
43 | /// both the .NET HttpListenerResponse and the HttpServer | ||
44 | /// HttpResponse (similar to OSHttpRequest); this duality is only | ||
45 | /// temporary and the .NET usage will disappear once the switch to | ||
46 | /// HttpServer is completed. | ||
47 | /// </remarks> | ||
48 | public class OSHttpResponse | 41 | public class OSHttpResponse |
49 | { | 42 | { |
50 | |||
51 | // property code below is a bit messy, will all resolve to | ||
52 | // harmony once we've completed the switch | ||
53 | |||
54 | /// <summary> | 43 | /// <summary> |
55 | /// Content type property. | 44 | /// Content type property. |
56 | /// </summary> | 45 | /// </summary> |
@@ -62,22 +51,12 @@ namespace OpenSim.Framework.Servers | |||
62 | { | 51 | { |
63 | get | 52 | get |
64 | { | 53 | { |
65 | if (HttpServer) | 54 | return _httpResponse.ContentType; |
66 | return _httpResponse.ContentType; | ||
67 | else | ||
68 | return _httpListenerResponse.ContentType; | ||
69 | } | 55 | } |
56 | |||
70 | set | 57 | set |
71 | { | 58 | { |
72 | if (HttpServer) | 59 | _httpResponse.ContentType = value; |
73 | { | ||
74 | _httpResponse.ContentType = value; | ||
75 | } | ||
76 | else | ||
77 | { | ||
78 | _httpListenerResponse.ContentType = value; | ||
79 | _contentTypeSet = true; | ||
80 | } | ||
81 | } | 60 | } |
82 | } | 61 | } |
83 | 62 | ||
@@ -102,17 +81,12 @@ namespace OpenSim.Framework.Servers | |||
102 | { | 81 | { |
103 | get | 82 | get |
104 | { | 83 | { |
105 | if (HttpServer) | 84 | return _httpResponse.ContentLength; |
106 | return _httpResponse.ContentLength; | ||
107 | else | ||
108 | return _httpListenerResponse.ContentLength64; | ||
109 | } | 85 | } |
86 | |||
110 | set | 87 | set |
111 | { | 88 | { |
112 | if (HttpServer) | 89 | _httpResponse.ContentLength = value; |
113 | _httpResponse.ContentLength = value; | ||
114 | else | ||
115 | _httpListenerResponse.ContentLength64 = value; | ||
116 | } | 90 | } |
117 | } | 91 | } |
118 | 92 | ||
@@ -132,59 +106,55 @@ namespace OpenSim.Framework.Servers | |||
132 | { | 106 | { |
133 | get | 107 | get |
134 | { | 108 | { |
135 | if (HttpServer) | 109 | return _httpResponse.Encoding; |
136 | return _httpResponse.Encoding; | ||
137 | else | ||
138 | return _httpListenerResponse.ContentEncoding; | ||
139 | } | 110 | } |
140 | 111 | ||
141 | set | 112 | set |
142 | { | 113 | { |
143 | if (HttpServer) | 114 | _httpResponse.Encoding = value; |
144 | _httpResponse.Encoding = value; | ||
145 | else | ||
146 | _httpListenerResponse.ContentEncoding = value; | ||
147 | } | 115 | } |
148 | } | 116 | } |
149 | 117 | ||
150 | /// <summary> | 118 | public bool KeepAlive |
151 | /// Headers of the response. | ||
152 | /// </summary> | ||
153 | public WebHeaderCollection Headers | ||
154 | { | 119 | { |
155 | get | 120 | get |
121 | { | ||
122 | return _httpResponse.Connection == ConnectionType.KeepAlive; | ||
123 | } | ||
124 | |||
125 | set | ||
156 | { | 126 | { |
157 | if (HttpServer) | 127 | if (value) |
158 | return null; | 128 | _httpResponse.Connection = ConnectionType.KeepAlive; |
159 | else | 129 | else |
160 | return _httpListenerResponse.Headers; | 130 | _httpResponse.Connection = ConnectionType.Close; |
161 | } | 131 | } |
162 | } | 132 | } |
163 | 133 | ||
164 | /// <summary> | 134 | /// <summary> |
165 | /// Get or set the keep alive property. | 135 | /// Get or set the keep alive timeout property (default is |
136 | /// 20). Setting this to 0 also disables KeepAlive. Setting | ||
137 | /// this to something else but 0 also enable KeepAlive. | ||
166 | /// </summary> | 138 | /// </summary> |
167 | public bool KeepAlive | 139 | public int KeepAliveTimeout |
168 | { | 140 | { |
169 | get | 141 | get |
170 | { | 142 | { |
171 | if (HttpServer) | 143 | return _httpResponse.KeepAlive; |
172 | return _httpResponse.Connection == ConnectionType.KeepAlive; | ||
173 | else | ||
174 | return _httpListenerResponse.KeepAlive; | ||
175 | } | 144 | } |
176 | 145 | ||
177 | set | 146 | set |
178 | { | 147 | { |
179 | if (HttpServer) | 148 | if (value == 0) |
180 | { | 149 | { |
181 | if (value == true) | 150 | _httpResponse.Connection = ConnectionType.Close; |
182 | _httpResponse.Connection = ConnectionType.KeepAlive; | 151 | _httpResponse.KeepAlive = 0; |
183 | else | ||
184 | _httpResponse.Connection = ConnectionType.Close; | ||
185 | } | 152 | } |
186 | else | 153 | else |
187 | _httpListenerResponse.KeepAlive = value; | 154 | { |
155 | _httpResponse.Connection = ConnectionType.KeepAlive; | ||
156 | _httpResponse.KeepAlive = value; | ||
157 | } | ||
188 | } | 158 | } |
189 | } | 159 | } |
190 | 160 | ||
@@ -198,10 +168,7 @@ namespace OpenSim.Framework.Servers | |||
198 | { | 168 | { |
199 | get | 169 | get |
200 | { | 170 | { |
201 | if (HttpServer) | 171 | return _httpResponse.Body; |
202 | return _httpResponse.Body; | ||
203 | else | ||
204 | return _httpListenerResponse.OutputStream; | ||
205 | } | 172 | } |
206 | } | 173 | } |
207 | 174 | ||
@@ -209,18 +176,12 @@ namespace OpenSim.Framework.Servers | |||
209 | { | 176 | { |
210 | get | 177 | get |
211 | { | 178 | { |
212 | if (HttpServer) | 179 | return _httpResponse.ProtocolVersion; |
213 | return _httpResponse.ProtocolVersion; | ||
214 | else | ||
215 | return _httpListenerResponse.ProtocolVersion.ToString(); | ||
216 | } | 180 | } |
181 | |||
217 | set | 182 | set |
218 | { | 183 | { |
219 | if (HttpServer) | 184 | _httpResponse.ProtocolVersion = value; |
220 | _httpResponse.ProtocolVersion = value; | ||
221 | else | ||
222 | _httpListenerResponse.ProtocolVersion = new Version(value); ; | ||
223 | |||
224 | } | 185 | } |
225 | } | 186 | } |
226 | 187 | ||
@@ -231,9 +192,7 @@ namespace OpenSim.Framework.Servers | |||
231 | { | 192 | { |
232 | get | 193 | get |
233 | { | 194 | { |
234 | if (HttpServer) | 195 | return _httpResponse.Body; |
235 | return _httpResponse.Body; | ||
236 | throw new Exception("[OSHttpResponse] mixed .NET and HttpServer access"); | ||
237 | } | 196 | } |
238 | } | 197 | } |
239 | 198 | ||
@@ -245,10 +204,7 @@ namespace OpenSim.Framework.Servers | |||
245 | // get { return _redirectLocation; } | 204 | // get { return _redirectLocation; } |
246 | set | 205 | set |
247 | { | 206 | { |
248 | if (HttpServer) | 207 | _httpResponse.Redirect(value); |
249 | _httpResponse.Redirect(value); | ||
250 | else | ||
251 | _httpListenerResponse.RedirectLocation = value; | ||
252 | } | 208 | } |
253 | } | 209 | } |
254 | 210 | ||
@@ -260,18 +216,12 @@ namespace OpenSim.Framework.Servers | |||
260 | { | 216 | { |
261 | get | 217 | get |
262 | { | 218 | { |
263 | if (HttpServer) | ||
264 | return _httpResponse.Chunked; | 219 | return _httpResponse.Chunked; |
265 | else | ||
266 | return _httpListenerResponse.SendChunked; | ||
267 | } | 220 | } |
268 | 221 | ||
269 | set | 222 | set |
270 | { | 223 | { |
271 | if (HttpServer) | 224 | _httpResponse.Chunked = value; |
272 | _httpResponse.Chunked = value; | ||
273 | else | ||
274 | _httpListenerResponse.SendChunked = value; | ||
275 | } | 225 | } |
276 | } | 226 | } |
277 | 227 | ||
@@ -282,18 +232,12 @@ namespace OpenSim.Framework.Servers | |||
282 | { | 232 | { |
283 | get | 233 | get |
284 | { | 234 | { |
285 | if (HttpServer) | 235 | return (int)_httpResponse.Status; |
286 | return (int)_httpResponse.Status; | ||
287 | else | ||
288 | return _httpListenerResponse.StatusCode; | ||
289 | } | 236 | } |
290 | 237 | ||
291 | set | 238 | set |
292 | { | 239 | { |
293 | if (HttpServer) | 240 | _httpResponse.Status = (HttpStatusCode)value; |
294 | _httpResponse.Status = (HttpStatusCode)value; | ||
295 | else | ||
296 | _httpListenerResponse.StatusCode = value; | ||
297 | } | 241 | } |
298 | } | 242 | } |
299 | 243 | ||
@@ -305,64 +249,35 @@ namespace OpenSim.Framework.Servers | |||
305 | { | 249 | { |
306 | get | 250 | get |
307 | { | 251 | { |
308 | if (HttpServer) | 252 | return _httpResponse.Reason; |
309 | return _httpResponse.Reason; | ||
310 | else | ||
311 | return _httpListenerResponse.StatusDescription; | ||
312 | } | 253 | } |
313 | 254 | ||
314 | set | 255 | set |
315 | { | 256 | { |
316 | if (HttpServer) | 257 | _httpResponse.Reason = value; |
317 | _httpResponse.Reason = value; | ||
318 | else | ||
319 | _httpListenerResponse.StatusDescription = value; | ||
320 | } | 258 | } |
321 | } | 259 | } |
322 | 260 | ||
323 | 261 | ||
324 | internal bool HttpServer | 262 | protected IHttpResponse _httpResponse; |
325 | { | ||
326 | get { return null != _httpResponse; } | ||
327 | } | ||
328 | private HttpResponse _httpResponse; | ||
329 | private HttpListenerResponse _httpListenerResponse; | ||
330 | 263 | ||
331 | internal HttpResponse HttpResponse | 264 | public OSHttpResponse() {} |
332 | { | ||
333 | get { return _httpResponse; } | ||
334 | } | ||
335 | |||
336 | public OSHttpResponse() | ||
337 | { | ||
338 | } | ||
339 | 265 | ||
340 | /// <summary> | 266 | public OSHttpResponse(IHttpResponse resp) |
341 | /// Instantiate an OSHttpResponse object based on an | ||
342 | /// underlying .NET HttpListenerResponse. | ||
343 | /// </summary> | ||
344 | /// <remarks> | ||
345 | /// Almost deprecated; will go west to make once HttpServer | ||
346 | /// base takes over. | ||
347 | /// </remarks> | ||
348 | public OSHttpResponse(HttpListenerResponse resp) | ||
349 | { | ||
350 | _httpListenerResponse = resp; | ||
351 | } | ||
352 | public OSHttpResponse(HttpServer.HttpResponse resp) | ||
353 | { | 267 | { |
354 | _httpResponse = resp; | 268 | _httpResponse = resp; |
355 | } | 269 | } |
270 | |||
356 | /// <summary> | 271 | /// <summary> |
357 | /// Instantiate an OSHttpResponse object from an OSHttpRequest | 272 | /// Instantiate an OSHttpResponse object from an OSHttpRequest |
358 | /// object. | 273 | /// object. |
359 | /// </summary | 274 | /// </summary |
360 | /// <param name="req">Incoming OSHttpRequest to which we are | 275 | /// <param name="req">Incoming OSHttpRequest to which we are |
361 | /// replying</param> | 276 | /// replying</param> |
362 | // public OSHttpResponse(OSHttpRequest req) | 277 | public OSHttpResponse(OSHttpRequest req) |
363 | // { | 278 | { |
364 | // _httpResponse = new HttpResponse(req.HttpClientContext, req.HttpRequest); | 279 | _httpResponse = new HttpResponse(req.IHttpClientContext, req.IHttpRequest); |
365 | // } | 280 | } |
366 | 281 | ||
367 | /// <summary> | 282 | /// <summary> |
368 | /// Add a header field and content to the response. | 283 | /// Add a header field and content to the response. |
@@ -373,10 +288,7 @@ namespace OpenSim.Framework.Servers | |||
373 | /// value</param> | 288 | /// value</param> |
374 | public void AddHeader(string key, string value) | 289 | public void AddHeader(string key, string value) |
375 | { | 290 | { |
376 | if (HttpServer) | 291 | _httpResponse.AddHeader(key, value); |
377 | _httpResponse.AddHeader(key, value); | ||
378 | else | ||
379 | _httpListenerResponse.Headers.Add(key, value); | ||
380 | } | 292 | } |
381 | 293 | ||
382 | /// <summary> | 294 | /// <summary> |
@@ -384,16 +296,8 @@ namespace OpenSim.Framework.Servers | |||
384 | /// </summary> | 296 | /// </summary> |
385 | public void Send() | 297 | public void Send() |
386 | { | 298 | { |
387 | if (HttpServer) | 299 | _httpResponse.Body.Flush(); |
388 | { | 300 | _httpResponse.Send(); |
389 | _httpResponse.Body.Flush(); | ||
390 | _httpResponse.Send(); | ||
391 | |||
392 | } | ||
393 | else | ||
394 | { | ||
395 | OutputStream.Close(); | ||
396 | } | ||
397 | } | 301 | } |
398 | } | 302 | } |
399 | } | 303 | } |