aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Framework
diff options
context:
space:
mode:
authorDr Scofield2008-10-06 21:59:43 +0000
committerDr Scofield2008-10-06 21:59:43 +0000
commitad04626737c164138d6d15d5e06eb20ff5b5f859 (patch)
tree6bc3aeb5dbb645503fcedb4012e68f069f8ada72 /OpenSim/Framework
parentoops. forgot testcase (diff)
downloadopensim-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 '')
-rw-r--r--OpenSim/Framework/Servers/BaseHttpServer.cs9
-rw-r--r--OpenSim/Framework/Servers/OSHttpRequest.cs20
-rw-r--r--OpenSim/Framework/Servers/OSHttpResponse.cs200
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}