diff options
Diffstat (limited to 'OpenSim/Framework/Servers')
5 files changed, 169 insertions, 313 deletions
diff --git a/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs b/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs index f5addc8..9cc1d4c 100644 --- a/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs +++ b/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs | |||
@@ -408,7 +408,10 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
408 | string uriString = request.RawUrl; | 408 | string uriString = request.RawUrl; |
409 | 409 | ||
410 | // string reqnum = "unknown"; | 410 | // string reqnum = "unknown"; |
411 | int tickstart = Environment.TickCount; | 411 | int requestStartTick = Environment.TickCount; |
412 | |||
413 | // Will be adjusted later on. | ||
414 | int requestEndTick = requestStartTick; | ||
412 | 415 | ||
413 | IRequestHandler requestHandler = null; | 416 | IRequestHandler requestHandler = null; |
414 | 417 | ||
@@ -433,6 +436,7 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
433 | { | 436 | { |
434 | if (HandleAgentRequest(agentHandler, request, response)) | 437 | if (HandleAgentRequest(agentHandler, request, response)) |
435 | { | 438 | { |
439 | requestEndTick = Environment.TickCount; | ||
436 | return; | 440 | return; |
437 | } | 441 | } |
438 | } | 442 | } |
@@ -442,6 +446,7 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
442 | 446 | ||
443 | string path = request.RawUrl; | 447 | string path = request.RawUrl; |
444 | string handlerKey = GetHandlerKey(request.HttpMethod, path); | 448 | string handlerKey = GetHandlerKey(request.HttpMethod, path); |
449 | byte[] buffer = null; | ||
445 | 450 | ||
446 | if (TryGetStreamHandler(handlerKey, out requestHandler)) | 451 | if (TryGetStreamHandler(handlerKey, out requestHandler)) |
447 | { | 452 | { |
@@ -450,9 +455,6 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
450 | "[BASE HTTP SERVER]: Found stream handler for {0} {1} {2} {3}", | 455 | "[BASE HTTP SERVER]: Found stream handler for {0} {1} {2} {3}", |
451 | request.HttpMethod, request.Url.PathAndQuery, requestHandler.Name, requestHandler.Description); | 456 | request.HttpMethod, request.Url.PathAndQuery, requestHandler.Name, requestHandler.Description); |
452 | 457 | ||
453 | // Okay, so this is bad, but should be considered temporary until everything is IStreamHandler. | ||
454 | byte[] buffer = null; | ||
455 | |||
456 | response.ContentType = requestHandler.ContentType; // Lets do this defaulting before in case handler has varying content type. | 458 | response.ContentType = requestHandler.ContentType; // Lets do this defaulting before in case handler has varying content type. |
457 | 459 | ||
458 | if (requestHandler is IStreamedRequestHandler) | 460 | if (requestHandler is IStreamedRequestHandler) |
@@ -507,8 +509,8 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
507 | //m_log.Warn("[HTTP]: " + requestBody); | 509 | //m_log.Warn("[HTTP]: " + requestBody); |
508 | 510 | ||
509 | } | 511 | } |
510 | DoHTTPGruntWork(HTTPRequestHandler.Handle(path, keysvals), response); | 512 | |
511 | return; | 513 | buffer = DoHTTPGruntWork(HTTPRequestHandler.Handle(path, keysvals), response); |
512 | } | 514 | } |
513 | else | 515 | else |
514 | { | 516 | { |
@@ -521,133 +523,100 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
521 | buffer = memoryStream.ToArray(); | 523 | buffer = memoryStream.ToArray(); |
522 | } | 524 | } |
523 | } | 525 | } |
524 | |||
525 | request.InputStream.Close(); | ||
526 | |||
527 | // HTTP IN support. The script engine takes it from here | ||
528 | // Nothing to worry about for us. | ||
529 | // | ||
530 | if (buffer == null) | ||
531 | return; | ||
532 | |||
533 | if (!response.SendChunked) | ||
534 | response.ContentLength64 = buffer.LongLength; | ||
535 | |||
536 | try | ||
537 | { | ||
538 | response.OutputStream.Write(buffer, 0, buffer.Length); | ||
539 | //response.OutputStream.Close(); | ||
540 | } | ||
541 | catch (HttpListenerException) | ||
542 | { | ||
543 | m_log.WarnFormat("[BASE HTTP SERVER]: HTTP request abnormally terminated."); | ||
544 | } | ||
545 | //response.OutputStream.Close(); | ||
546 | try | ||
547 | { | ||
548 | response.Send(); | ||
549 | //response.FreeContext(); | ||
550 | } | ||
551 | catch (SocketException e) | ||
552 | { | ||
553 | // This has to be here to prevent a Linux/Mono crash | ||
554 | m_log.Warn(String.Format("[BASE HTTP SERVER]: XmlRpcRequest issue {0}.\nNOTE: this may be spurious on Linux. ", e.Message), e); | ||
555 | } | ||
556 | catch (IOException e) | ||
557 | { | ||
558 | m_log.Warn(String.Format("[BASE HTTP SERVER]: XmlRpcRequest issue {0}. ", e.Message), e); | ||
559 | } | ||
560 | |||
561 | return; | ||
562 | } | 526 | } |
563 | 527 | else | |
564 | if (request.AcceptTypes != null && request.AcceptTypes.Length > 0) | ||
565 | { | 528 | { |
566 | foreach (string strAccept in request.AcceptTypes) | 529 | switch (request.ContentType) |
567 | { | 530 | { |
568 | if (strAccept.Contains("application/llsd+xml") || | 531 | case null: |
569 | strAccept.Contains("application/llsd+json")) | 532 | case "text/html": |
570 | { | 533 | |
571 | if (DebugLevel >= 1) | ||
572 | m_log.DebugFormat( | ||
573 | "[BASE HTTP SERVER]: Found application/llsd+xml accept header handler for {0} {1}", | ||
574 | request.HttpMethod, request.Url.PathAndQuery); | ||
575 | |||
576 | HandleLLSDRequests(request, response); | ||
577 | return; | ||
578 | } | ||
579 | } | ||
580 | } | ||
581 | |||
582 | switch (request.ContentType) | ||
583 | { | ||
584 | case null: | ||
585 | case "text/html": | ||
586 | |||
587 | if (DebugLevel >= 1) | ||
588 | m_log.DebugFormat( | ||
589 | "[BASE HTTP SERVER]: Found a {0} content type handler for {1} {2}", | ||
590 | request.ContentType, request.HttpMethod, request.Url.PathAndQuery); | ||
591 | |||
592 | HandleHTTPRequest(request, response); | ||
593 | return; | ||
594 | |||
595 | case "application/llsd+xml": | ||
596 | case "application/xml+llsd": | ||
597 | case "application/llsd+json": | ||
598 | |||
599 | if (DebugLevel >= 1) | ||
600 | m_log.DebugFormat( | ||
601 | "[BASE HTTP SERVER]: Found a {0} content type handler for {1} {2}", | ||
602 | request.ContentType, request.HttpMethod, request.Url.PathAndQuery); | ||
603 | |||
604 | HandleLLSDRequests(request, response); | ||
605 | return; | ||
606 | |||
607 | case "text/xml": | ||
608 | case "application/xml": | ||
609 | case "application/json": | ||
610 | default: | ||
611 | //m_log.Info("[Debug BASE HTTP SERVER]: in default handler"); | ||
612 | // Point of note.. the DoWeHaveA methods check for an EXACT path | ||
613 | // if (request.RawUrl.Contains("/CAPS/EQG")) | ||
614 | // { | ||
615 | // int i = 1; | ||
616 | // } | ||
617 | //m_log.Info("[Debug BASE HTTP SERVER]: Checking for LLSD Handler"); | ||
618 | if (DoWeHaveALLSDHandler(request.RawUrl)) | ||
619 | { | ||
620 | if (DebugLevel >= 1) | 534 | if (DebugLevel >= 1) |
621 | m_log.DebugFormat( | 535 | m_log.DebugFormat( |
622 | "[BASE HTTP SERVER]: Found a {0} content type handler for {1} {2}", | 536 | "[BASE HTTP SERVER]: Found a {0} content type handler for {1} {2}", |
623 | request.ContentType, request.HttpMethod, request.Url.PathAndQuery); | 537 | request.ContentType, request.HttpMethod, request.Url.PathAndQuery); |
624 | 538 | ||
625 | HandleLLSDRequests(request, response); | 539 | buffer = HandleHTTPRequest(request, response); |
626 | return; | 540 | break; |
627 | } | 541 | |
628 | 542 | case "application/llsd+xml": | |
629 | // m_log.DebugFormat("[BASE HTTP SERVER]: Checking for HTTP Handler for request {0}", request.RawUrl); | 543 | case "application/xml+llsd": |
630 | if (DoWeHaveAHTTPHandler(request.RawUrl)) | 544 | case "application/llsd+json": |
631 | { | 545 | |
632 | if (DebugLevel >= 1) | 546 | if (DebugLevel >= 1) |
633 | m_log.DebugFormat( | 547 | m_log.DebugFormat( |
634 | "[BASE HTTP SERVER]: Found a {0} content type handler for {1} {2}", | 548 | "[BASE HTTP SERVER]: Found a {0} content type handler for {1} {2}", |
635 | request.ContentType, request.HttpMethod, request.Url.PathAndQuery); | 549 | request.ContentType, request.HttpMethod, request.Url.PathAndQuery); |
550 | |||
551 | buffer = HandleLLSDRequests(request, response); | ||
552 | break; | ||
553 | |||
554 | case "text/xml": | ||
555 | case "application/xml": | ||
556 | case "application/json": | ||
557 | default: | ||
558 | //m_log.Info("[Debug BASE HTTP SERVER]: in default handler"); | ||
559 | // Point of note.. the DoWeHaveA methods check for an EXACT path | ||
560 | // if (request.RawUrl.Contains("/CAPS/EQG")) | ||
561 | // { | ||
562 | // int i = 1; | ||
563 | // } | ||
564 | //m_log.Info("[Debug BASE HTTP SERVER]: Checking for LLSD Handler"); | ||
565 | if (DoWeHaveALLSDHandler(request.RawUrl)) | ||
566 | { | ||
567 | if (DebugLevel >= 1) | ||
568 | m_log.DebugFormat( | ||
569 | "[BASE HTTP SERVER]: Found a {0} content type handler for {1} {2}", | ||
570 | request.ContentType, request.HttpMethod, request.Url.PathAndQuery); | ||
571 | |||
572 | buffer = HandleLLSDRequests(request, response); | ||
573 | } | ||
574 | // m_log.DebugFormat("[BASE HTTP SERVER]: Checking for HTTP Handler for request {0}", request.RawUrl); | ||
575 | else if (DoWeHaveAHTTPHandler(request.RawUrl)) | ||
576 | { | ||
577 | if (DebugLevel >= 1) | ||
578 | m_log.DebugFormat( | ||
579 | "[BASE HTTP SERVER]: Found a {0} content type handler for {1} {2}", | ||
580 | request.ContentType, request.HttpMethod, request.Url.PathAndQuery); | ||
581 | |||
582 | buffer = HandleHTTPRequest(request, response); | ||
583 | } | ||
584 | else | ||
585 | { | ||
586 | |||
587 | if (DebugLevel >= 1) | ||
588 | m_log.DebugFormat( | ||
589 | "[BASE HTTP SERVER]: Assuming a generic XMLRPC request for {0} {1}", | ||
590 | request.HttpMethod, request.Url.PathAndQuery); | ||
591 | |||
592 | // generic login request. | ||
593 | buffer = HandleXmlRpcRequests(request, response); | ||
594 | } | ||
595 | |||
596 | break; | ||
597 | } | ||
598 | } | ||
636 | 599 | ||
637 | HandleHTTPRequest(request, response); | 600 | request.InputStream.Close(); |
638 | return; | ||
639 | } | ||
640 | |||
641 | if (DebugLevel >= 1) | ||
642 | m_log.DebugFormat( | ||
643 | "[BASE HTTP SERVER]: Assuming a generic XMLRPC request for {0} {1}", | ||
644 | request.HttpMethod, request.Url.PathAndQuery); | ||
645 | 601 | ||
646 | // generic login request. | 602 | if (buffer != null) |
647 | HandleXmlRpcRequests(request, response); | 603 | { |
604 | if (!response.SendChunked) | ||
605 | response.ContentLength64 = buffer.LongLength; | ||
648 | 606 | ||
649 | return; | 607 | response.OutputStream.Write(buffer, 0, buffer.Length); |
650 | } | 608 | } |
609 | |||
610 | // Do not include the time taken to actually send the response to the caller in the measurement | ||
611 | // time. This is to avoid logging when it's the client that is slow to process rather than the | ||
612 | // server | ||
613 | requestEndTick = Environment.TickCount; | ||
614 | |||
615 | response.Send(); | ||
616 | |||
617 | //response.OutputStream.Close(); | ||
618 | |||
619 | //response.FreeContext(); | ||
651 | } | 620 | } |
652 | catch (SocketException e) | 621 | catch (SocketException e) |
653 | { | 622 | { |
@@ -672,8 +641,8 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
672 | finally | 641 | finally |
673 | { | 642 | { |
674 | // Every month or so this will wrap and give bad numbers, not really a problem | 643 | // Every month or so this will wrap and give bad numbers, not really a problem |
675 | // since its just for reporting, tickdiff limit can be adjusted | 644 | // since its just for reporting |
676 | int tickdiff = Environment.TickCount - tickstart; | 645 | int tickdiff = requestEndTick - requestStartTick; |
677 | if (tickdiff > 3000) | 646 | if (tickdiff > 3000) |
678 | { | 647 | { |
679 | m_log.InfoFormat( | 648 | m_log.InfoFormat( |
@@ -805,7 +774,7 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
805 | /// </summary> | 774 | /// </summary> |
806 | /// <param name="request"></param> | 775 | /// <param name="request"></param> |
807 | /// <param name="response"></param> | 776 | /// <param name="response"></param> |
808 | private void HandleXmlRpcRequests(OSHttpRequest request, OSHttpResponse response) | 777 | private byte[] HandleXmlRpcRequests(OSHttpRequest request, OSHttpResponse response) |
809 | { | 778 | { |
810 | Stream requestStream = request.InputStream; | 779 | Stream requestStream = request.InputStream; |
811 | 780 | ||
@@ -817,7 +786,7 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
817 | requestStream.Close(); | 786 | requestStream.Close(); |
818 | //m_log.Debug(requestBody); | 787 | //m_log.Debug(requestBody); |
819 | requestBody = requestBody.Replace("<base64></base64>", ""); | 788 | requestBody = requestBody.Replace("<base64></base64>", ""); |
820 | string responseString = String.Empty; | 789 | string responseString = null; |
821 | XmlRpcRequest xmlRprcRequest = null; | 790 | XmlRpcRequest xmlRprcRequest = null; |
822 | 791 | ||
823 | try | 792 | try |
@@ -895,6 +864,7 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
895 | String.Format("Requested method [{0}] not found", methodName)); | 864 | String.Format("Requested method [{0}] not found", methodName)); |
896 | } | 865 | } |
897 | 866 | ||
867 | response.ContentType = "text/xml"; | ||
898 | responseString = XmlRpcResponseSerializer.Singleton.Serialize(xmlRpcResponse); | 868 | responseString = XmlRpcResponseSerializer.Singleton.Serialize(xmlRpcResponse); |
899 | } | 869 | } |
900 | else | 870 | else |
@@ -904,82 +874,25 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
904 | response.StatusCode = 404; | 874 | response.StatusCode = 404; |
905 | response.StatusDescription = "Not Found"; | 875 | response.StatusDescription = "Not Found"; |
906 | response.ProtocolVersion = "HTTP/1.0"; | 876 | response.ProtocolVersion = "HTTP/1.0"; |
907 | byte[] buf = Encoding.UTF8.GetBytes("Not found"); | 877 | responseString = "Not found"; |
908 | response.KeepAlive = false; | 878 | response.KeepAlive = false; |
909 | 879 | ||
910 | m_log.ErrorFormat( | 880 | m_log.ErrorFormat( |
911 | "[BASE HTTP SERVER]: Handler not found for http request {0} {1}", | 881 | "[BASE HTTP SERVER]: Handler not found for http request {0} {1}", |
912 | request.HttpMethod, request.Url.PathAndQuery); | 882 | request.HttpMethod, request.Url.PathAndQuery); |
913 | |||
914 | response.SendChunked = false; | ||
915 | response.ContentLength64 = buf.Length; | ||
916 | response.ContentEncoding = Encoding.UTF8; | ||
917 | |||
918 | try | ||
919 | { | ||
920 | response.OutputStream.Write(buf, 0, buf.Length); | ||
921 | } | ||
922 | catch (Exception ex) | ||
923 | { | ||
924 | m_log.Warn("[BASE HTTP SERVER]: Error - " + ex.Message); | ||
925 | } | ||
926 | finally | ||
927 | { | ||
928 | try | ||
929 | { | ||
930 | response.Send(); | ||
931 | //response.FreeContext(); | ||
932 | } | ||
933 | catch (SocketException e) | ||
934 | { | ||
935 | // This has to be here to prevent a Linux/Mono crash | ||
936 | m_log.Warn(String.Format("[BASE HTTP SERVER]: XmlRpcRequest issue {0}.\nNOTE: this may be spurious on Linux. ", e.Message), e); | ||
937 | } | ||
938 | catch (IOException e) | ||
939 | { | ||
940 | m_log.Warn(String.Format("[BASE HTTP SERVER]: XmlRpcRequest issue {0} ", e.Message), e); | ||
941 | } | ||
942 | } | ||
943 | return; | ||
944 | //responseString = "Error"; | ||
945 | } | 883 | } |
946 | } | 884 | } |
947 | 885 | ||
948 | response.ContentType = "text/xml"; | ||
949 | |||
950 | byte[] buffer = Encoding.UTF8.GetBytes(responseString); | 886 | byte[] buffer = Encoding.UTF8.GetBytes(responseString); |
951 | 887 | ||
952 | response.SendChunked = false; | 888 | response.SendChunked = false; |
953 | response.ContentLength64 = buffer.Length; | 889 | response.ContentLength64 = buffer.Length; |
954 | response.ContentEncoding = Encoding.UTF8; | 890 | response.ContentEncoding = Encoding.UTF8; |
955 | try | 891 | |
956 | { | 892 | return buffer; |
957 | response.OutputStream.Write(buffer, 0, buffer.Length); | ||
958 | } | ||
959 | catch (Exception ex) | ||
960 | { | ||
961 | m_log.Warn("[BASE HTTP SERVER]: Error - " + ex.Message); | ||
962 | } | ||
963 | finally | ||
964 | { | ||
965 | try | ||
966 | { | ||
967 | response.Send(); | ||
968 | //response.FreeContext(); | ||
969 | } | ||
970 | catch (SocketException e) | ||
971 | { | ||
972 | // This has to be here to prevent a Linux/Mono crash | ||
973 | m_log.Warn(String.Format("[BASE HTTP SERVER]: XmlRpcRequest issue {0}.\nNOTE: this may be spurious on Linux. ", e.Message), e); | ||
974 | } | ||
975 | catch (IOException e) | ||
976 | { | ||
977 | m_log.Warn(String.Format("[BASE HTTP SERVER]: XmlRpcRequest issue {0} ", e.Message), e); | ||
978 | } | ||
979 | } | ||
980 | } | 893 | } |
981 | 894 | ||
982 | private void HandleLLSDRequests(OSHttpRequest request, OSHttpResponse response) | 895 | private byte[] HandleLLSDRequests(OSHttpRequest request, OSHttpResponse response) |
983 | { | 896 | { |
984 | //m_log.Warn("[BASE HTTP SERVER]: We've figured out it's a LLSD Request"); | 897 | //m_log.Warn("[BASE HTTP SERVER]: We've figured out it's a LLSD Request"); |
985 | Stream requestStream = request.InputStream; | 898 | Stream requestStream = request.InputStream; |
@@ -1065,34 +978,7 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
1065 | response.ContentEncoding = Encoding.UTF8; | 978 | response.ContentEncoding = Encoding.UTF8; |
1066 | response.KeepAlive = true; | 979 | response.KeepAlive = true; |
1067 | 980 | ||
1068 | try | 981 | return buffer; |
1069 | { | ||
1070 | response.OutputStream.Write(buffer, 0, buffer.Length); | ||
1071 | } | ||
1072 | catch (Exception ex) | ||
1073 | { | ||
1074 | m_log.Warn("[BASE HTTP SERVER]: Error - " + ex.Message); | ||
1075 | } | ||
1076 | finally | ||
1077 | { | ||
1078 | //response.OutputStream.Close(); | ||
1079 | try | ||
1080 | { | ||
1081 | response.Send(); | ||
1082 | response.OutputStream.Flush(); | ||
1083 | //response.FreeContext(); | ||
1084 | //response.OutputStream.Close(); | ||
1085 | } | ||
1086 | catch (IOException e) | ||
1087 | { | ||
1088 | m_log.Warn(String.Format("[BASE HTTP SERVER]: LLSD IOException {0} ", e.Message), e); | ||
1089 | } | ||
1090 | catch (SocketException e) | ||
1091 | { | ||
1092 | // This has to be here to prevent a Linux/Mono crash | ||
1093 | m_log.Warn(String.Format("[BASE HTTP SERVER]: LLSD issue {0}.\nNOTE: this may be spurious on Linux. ", e.Message), e); | ||
1094 | } | ||
1095 | } | ||
1096 | } | 982 | } |
1097 | 983 | ||
1098 | private byte[] BuildLLSDResponse(OSHttpRequest request, OSHttpResponse response, OSD llsdResponse) | 984 | private byte[] BuildLLSDResponse(OSHttpRequest request, OSHttpResponse response, OSD llsdResponse) |
@@ -1357,7 +1243,7 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
1357 | 1243 | ||
1358 | } | 1244 | } |
1359 | 1245 | ||
1360 | public void HandleHTTPRequest(OSHttpRequest request, OSHttpResponse response) | 1246 | public byte[] HandleHTTPRequest(OSHttpRequest request, OSHttpResponse response) |
1361 | { | 1247 | { |
1362 | // m_log.DebugFormat( | 1248 | // m_log.DebugFormat( |
1363 | // "[BASE HTTP SERVER]: HandleHTTPRequest for request to {0}, method {1}", | 1249 | // "[BASE HTTP SERVER]: HandleHTTPRequest for request to {0}, method {1}", |
@@ -1367,15 +1253,14 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
1367 | { | 1253 | { |
1368 | case "OPTIONS": | 1254 | case "OPTIONS": |
1369 | response.StatusCode = (int)OSHttpStatusCode.SuccessOk; | 1255 | response.StatusCode = (int)OSHttpStatusCode.SuccessOk; |
1370 | return; | 1256 | return null; |
1371 | 1257 | ||
1372 | default: | 1258 | default: |
1373 | HandleContentVerbs(request, response); | 1259 | return HandleContentVerbs(request, response); |
1374 | return; | ||
1375 | } | 1260 | } |
1376 | } | 1261 | } |
1377 | 1262 | ||
1378 | private void HandleContentVerbs(OSHttpRequest request, OSHttpResponse response) | 1263 | private byte[] HandleContentVerbs(OSHttpRequest request, OSHttpResponse response) |
1379 | { | 1264 | { |
1380 | // m_log.DebugFormat("[BASE HTTP SERVER]: HandleContentVerbs for request to {0}", request.RawUrl); | 1265 | // m_log.DebugFormat("[BASE HTTP SERVER]: HandleContentVerbs for request to {0}", request.RawUrl); |
1381 | 1266 | ||
@@ -1391,6 +1276,8 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
1391 | // to display the form, or process it. | 1276 | // to display the form, or process it. |
1392 | // a better way would be nifty. | 1277 | // a better way would be nifty. |
1393 | 1278 | ||
1279 | byte[] buffer; | ||
1280 | |||
1394 | Stream requestStream = request.InputStream; | 1281 | Stream requestStream = request.InputStream; |
1395 | 1282 | ||
1396 | Encoding encoding = Encoding.UTF8; | 1283 | Encoding encoding = Encoding.UTF8; |
@@ -1451,14 +1338,14 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
1451 | if (foundHandler) | 1338 | if (foundHandler) |
1452 | { | 1339 | { |
1453 | Hashtable responsedata1 = requestprocessor(keysvals); | 1340 | Hashtable responsedata1 = requestprocessor(keysvals); |
1454 | DoHTTPGruntWork(responsedata1,response); | 1341 | buffer = DoHTTPGruntWork(responsedata1,response); |
1455 | 1342 | ||
1456 | //SendHTML500(response); | 1343 | //SendHTML500(response); |
1457 | } | 1344 | } |
1458 | else | 1345 | else |
1459 | { | 1346 | { |
1460 | // m_log.Warn("[BASE HTTP SERVER]: Handler Not Found"); | 1347 | // m_log.Warn("[BASE HTTP SERVER]: Handler Not Found"); |
1461 | SendHTML404(response, host); | 1348 | buffer = SendHTML404(response, host); |
1462 | } | 1349 | } |
1463 | } | 1350 | } |
1464 | else | 1351 | else |
@@ -1468,16 +1355,18 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
1468 | if (foundHandler) | 1355 | if (foundHandler) |
1469 | { | 1356 | { |
1470 | Hashtable responsedata2 = requestprocessor(keysvals); | 1357 | Hashtable responsedata2 = requestprocessor(keysvals); |
1471 | DoHTTPGruntWork(responsedata2, response); | 1358 | buffer = DoHTTPGruntWork(responsedata2, response); |
1472 | 1359 | ||
1473 | //SendHTML500(response); | 1360 | //SendHTML500(response); |
1474 | } | 1361 | } |
1475 | else | 1362 | else |
1476 | { | 1363 | { |
1477 | // m_log.Warn("[BASE HTTP SERVER]: Handler Not Found2"); | 1364 | // m_log.Warn("[BASE HTTP SERVER]: Handler Not Found2"); |
1478 | SendHTML404(response, host); | 1365 | buffer = SendHTML404(response, host); |
1479 | } | 1366 | } |
1480 | } | 1367 | } |
1368 | |||
1369 | return buffer; | ||
1481 | } | 1370 | } |
1482 | 1371 | ||
1483 | private bool TryGetHTTPHandlerPathBased(string path, out GenericHTTPMethod httpHandler) | 1372 | private bool TryGetHTTPHandlerPathBased(string path, out GenericHTTPMethod httpHandler) |
@@ -1545,7 +1434,7 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
1545 | } | 1434 | } |
1546 | } | 1435 | } |
1547 | 1436 | ||
1548 | internal void DoHTTPGruntWork(Hashtable responsedata, OSHttpResponse response) | 1437 | internal byte[] DoHTTPGruntWork(Hashtable responsedata, OSHttpResponse response) |
1549 | { | 1438 | { |
1550 | int responsecode; | 1439 | int responsecode; |
1551 | string responseString; | 1440 | string responseString; |
@@ -1639,38 +1528,10 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
1639 | response.ContentLength64 = buffer.Length; | 1528 | response.ContentLength64 = buffer.Length; |
1640 | response.ContentEncoding = Encoding.UTF8; | 1529 | response.ContentEncoding = Encoding.UTF8; |
1641 | 1530 | ||
1642 | try | 1531 | return buffer; |
1643 | { | ||
1644 | response.OutputStream.Write(buffer, 0, buffer.Length); | ||
1645 | } | ||
1646 | catch (Exception ex) | ||
1647 | { | ||
1648 | m_log.Warn("[HTTPD]: Error - " + ex.Message); | ||
1649 | } | ||
1650 | finally | ||
1651 | { | ||
1652 | //response.OutputStream.Close(); | ||
1653 | try | ||
1654 | { | ||
1655 | response.OutputStream.Flush(); | ||
1656 | response.Send(); | ||
1657 | |||
1658 | //if (!response.KeepAlive && response.ReuseContext) | ||
1659 | // response.FreeContext(); | ||
1660 | } | ||
1661 | catch (SocketException e) | ||
1662 | { | ||
1663 | // This has to be here to prevent a Linux/Mono crash | ||
1664 | m_log.Warn(String.Format("[BASE HTTP SERVER]: XmlRpcRequest issue {0}.\nNOTE: this may be spurious on Linux. ", e.Message), e); | ||
1665 | } | ||
1666 | catch (IOException e) | ||
1667 | { | ||
1668 | m_log.Warn(String.Format("[BASE HTTP SERVER]: XmlRpcRequest issue {0} ", e.Message), e); | ||
1669 | } | ||
1670 | } | ||
1671 | } | 1532 | } |
1672 | 1533 | ||
1673 | public void SendHTML404(OSHttpResponse response, string host) | 1534 | public byte[] SendHTML404(OSHttpResponse response, string host) |
1674 | { | 1535 | { |
1675 | // I know this statuscode is dumb, but the client doesn't respond to 404s and 500s | 1536 | // I know this statuscode is dumb, but the client doesn't respond to 404s and 500s |
1676 | response.StatusCode = 404; | 1537 | response.StatusCode = 404; |
@@ -1683,31 +1544,10 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
1683 | response.ContentLength64 = buffer.Length; | 1544 | response.ContentLength64 = buffer.Length; |
1684 | response.ContentEncoding = Encoding.UTF8; | 1545 | response.ContentEncoding = Encoding.UTF8; |
1685 | 1546 | ||
1686 | try | 1547 | return buffer; |
1687 | { | ||
1688 | response.OutputStream.Write(buffer, 0, buffer.Length); | ||
1689 | } | ||
1690 | catch (Exception ex) | ||
1691 | { | ||
1692 | m_log.Warn("[BASE HTTP SERVER]: Error - " + ex.Message); | ||
1693 | } | ||
1694 | finally | ||
1695 | { | ||
1696 | //response.OutputStream.Close(); | ||
1697 | try | ||
1698 | { | ||
1699 | response.Send(); | ||
1700 | //response.FreeContext(); | ||
1701 | } | ||
1702 | catch (SocketException e) | ||
1703 | { | ||
1704 | // This has to be here to prevent a Linux/Mono crash | ||
1705 | m_log.Warn(String.Format("[BASE HTTP SERVER]: XmlRpcRequest issue {0}.\nNOTE: this may be spurious on Linux. ", e.Message), e); | ||
1706 | } | ||
1707 | } | ||
1708 | } | 1548 | } |
1709 | 1549 | ||
1710 | public void SendHTML500(OSHttpResponse response) | 1550 | public byte[] SendHTML500(OSHttpResponse response) |
1711 | { | 1551 | { |
1712 | // I know this statuscode is dumb, but the client doesn't respond to 404s and 500s | 1552 | // I know this statuscode is dumb, but the client doesn't respond to 404s and 500s |
1713 | response.StatusCode = (int)OSHttpStatusCode.SuccessOk; | 1553 | response.StatusCode = (int)OSHttpStatusCode.SuccessOk; |
@@ -1719,28 +1559,8 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
1719 | response.SendChunked = false; | 1559 | response.SendChunked = false; |
1720 | response.ContentLength64 = buffer.Length; | 1560 | response.ContentLength64 = buffer.Length; |
1721 | response.ContentEncoding = Encoding.UTF8; | 1561 | response.ContentEncoding = Encoding.UTF8; |
1722 | try | 1562 | |
1723 | { | 1563 | return buffer; |
1724 | response.OutputStream.Write(buffer, 0, buffer.Length); | ||
1725 | } | ||
1726 | catch (Exception ex) | ||
1727 | { | ||
1728 | m_log.Warn("[BASE HTTP SERVER]: Error - " + ex.Message); | ||
1729 | } | ||
1730 | finally | ||
1731 | { | ||
1732 | //response.OutputStream.Close(); | ||
1733 | try | ||
1734 | { | ||
1735 | response.Send(); | ||
1736 | //response.FreeContext(); | ||
1737 | } | ||
1738 | catch (SocketException e) | ||
1739 | { | ||
1740 | // This has to be here to prevent a Linux/Mono crash | ||
1741 | m_log.Warn(String.Format("[BASE HTTP SERVER] XmlRpcRequest issue {0}.\nNOTE: this may be spurious on Linux. ", e.Message), e); | ||
1742 | } | ||
1743 | } | ||
1744 | } | 1564 | } |
1745 | 1565 | ||
1746 | public void Start() | 1566 | public void Start() |
diff --git a/OpenSim/Framework/Servers/HttpServer/Interfaces/IOSHttpResponse.cs b/OpenSim/Framework/Servers/HttpServer/Interfaces/IOSHttpResponse.cs index 33a1663..f61b090 100644 --- a/OpenSim/Framework/Servers/HttpServer/Interfaces/IOSHttpResponse.cs +++ b/OpenSim/Framework/Servers/HttpServer/Interfaces/IOSHttpResponse.cs | |||
@@ -128,11 +128,5 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
128 | /// <param name="value">string containing the header field | 128 | /// <param name="value">string containing the header field |
129 | /// value</param> | 129 | /// value</param> |
130 | void AddHeader(string key, string value); | 130 | void AddHeader(string key, string value); |
131 | |||
132 | /// <summary> | ||
133 | /// Send the response back to the remote client | ||
134 | /// </summary> | ||
135 | void Send(); | ||
136 | } | 131 | } |
137 | } | 132 | } \ No newline at end of file |
138 | |||
diff --git a/OpenSim/Framework/Servers/HttpServer/OSHttpResponse.cs b/OpenSim/Framework/Servers/HttpServer/OSHttpResponse.cs index f9227ac..89fb5d4 100644 --- a/OpenSim/Framework/Servers/HttpServer/OSHttpResponse.cs +++ b/OpenSim/Framework/Servers/HttpServer/OSHttpResponse.cs | |||
@@ -321,13 +321,12 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
321 | { | 321 | { |
322 | _httpResponse.Body.Flush(); | 322 | _httpResponse.Body.Flush(); |
323 | _httpResponse.Send(); | 323 | _httpResponse.Send(); |
324 | |||
325 | } | 324 | } |
325 | |||
326 | public void FreeContext() | 326 | public void FreeContext() |
327 | { | 327 | { |
328 | if (_httpClientContext != null) | 328 | if (_httpClientContext != null) |
329 | _httpClientContext.Close(); | 329 | _httpClientContext.Close(); |
330 | } | 330 | } |
331 | |||
332 | } | 331 | } |
333 | } \ No newline at end of file | 332 | } \ No newline at end of file |
diff --git a/OpenSim/Framework/Servers/HttpServer/PollServiceRequestManager.cs b/OpenSim/Framework/Servers/HttpServer/PollServiceRequestManager.cs index f96fd1f..3252251 100644 --- a/OpenSim/Framework/Servers/HttpServer/PollServiceRequestManager.cs +++ b/OpenSim/Framework/Servers/HttpServer/PollServiceRequestManager.cs | |||
@@ -140,9 +140,8 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
140 | foreach (object o in m_requests) | 140 | foreach (object o in m_requests) |
141 | { | 141 | { |
142 | PollServiceHttpRequest req = (PollServiceHttpRequest) o; | 142 | PollServiceHttpRequest req = (PollServiceHttpRequest) o; |
143 | m_server.DoHTTPGruntWork( | 143 | PollServiceWorkerThread.DoHTTPGruntWork( |
144 | req.PollServiceArgs.NoEvents(req.RequestID, req.PollServiceArgs.Id), | 144 | m_server, req, req.PollServiceArgs.NoEvents(req.RequestID, req.PollServiceArgs.Id)); |
145 | new OSHttpResponse(new HttpResponse(req.HttpContext, req.Request), req.HttpContext)); | ||
146 | } | 145 | } |
147 | 146 | ||
148 | m_requests.Clear(); | 147 | m_requests.Clear(); |
@@ -151,6 +150,7 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
151 | { | 150 | { |
152 | t.Abort(); | 151 | t.Abort(); |
153 | } | 152 | } |
153 | |||
154 | m_running = false; | 154 | m_running = false; |
155 | } | 155 | } |
156 | } | 156 | } |
diff --git a/OpenSim/Framework/Servers/HttpServer/PollServiceWorkerThread.cs b/OpenSim/Framework/Servers/HttpServer/PollServiceWorkerThread.cs index 5e171f0..2995421 100644 --- a/OpenSim/Framework/Servers/HttpServer/PollServiceWorkerThread.cs +++ b/OpenSim/Framework/Servers/HttpServer/PollServiceWorkerThread.cs | |||
@@ -90,15 +90,16 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
90 | } | 90 | } |
91 | 91 | ||
92 | Hashtable responsedata = req.PollServiceArgs.GetEvents(req.RequestID, req.PollServiceArgs.Id, str.ReadToEnd()); | 92 | Hashtable responsedata = req.PollServiceArgs.GetEvents(req.RequestID, req.PollServiceArgs.Id, str.ReadToEnd()); |
93 | m_server.DoHTTPGruntWork(responsedata, | 93 | DoHTTPGruntWork(m_server, req, responsedata); |
94 | new OSHttpResponse(new HttpResponse(req.HttpContext, req.Request),req.HttpContext)); | ||
95 | } | 94 | } |
96 | else | 95 | else |
97 | { | 96 | { |
98 | if ((Environment.TickCount - req.RequestTime) > m_timeout) | 97 | if ((Environment.TickCount - req.RequestTime) > m_timeout) |
99 | { | 98 | { |
100 | m_server.DoHTTPGruntWork(req.PollServiceArgs.NoEvents(req.RequestID, req.PollServiceArgs.Id), | 99 | DoHTTPGruntWork( |
101 | new OSHttpResponse(new HttpResponse(req.HttpContext, req.Request),req.HttpContext)); | 100 | m_server, |
101 | req, | ||
102 | req.PollServiceArgs.NoEvents(req.RequestID, req.PollServiceArgs.Id)); | ||
102 | } | 103 | } |
103 | else | 104 | else |
104 | { | 105 | { |
@@ -119,5 +120,47 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
119 | { | 120 | { |
120 | m_request.Enqueue(pPollServiceHttpRequest); | 121 | m_request.Enqueue(pPollServiceHttpRequest); |
121 | } | 122 | } |
123 | |||
124 | /// <summary> | ||
125 | /// FIXME: This should be part of BaseHttpServer | ||
126 | /// </summary> | ||
127 | internal static void DoHTTPGruntWork(BaseHttpServer server, PollServiceHttpRequest req, Hashtable responsedata) | ||
128 | { | ||
129 | OSHttpResponse response | ||
130 | = new OSHttpResponse(new HttpResponse(req.HttpContext, req.Request), req.HttpContext); | ||
131 | |||
132 | byte[] buffer | ||
133 | = server.DoHTTPGruntWork( | ||
134 | responsedata, new OSHttpResponse(new HttpResponse(req.HttpContext, req.Request), req.HttpContext)); | ||
135 | |||
136 | response.SendChunked = false; | ||
137 | response.ContentLength64 = buffer.Length; | ||
138 | response.ContentEncoding = Encoding.UTF8; | ||
139 | |||
140 | try | ||
141 | { | ||
142 | response.OutputStream.Write(buffer, 0, buffer.Length); | ||
143 | } | ||
144 | catch (Exception ex) | ||
145 | { | ||
146 | m_log.Warn(string.Format("[POLL SERVICE WORKER THREAD]: Error ", ex)); | ||
147 | } | ||
148 | finally | ||
149 | { | ||
150 | //response.OutputStream.Close(); | ||
151 | try | ||
152 | { | ||
153 | response.OutputStream.Flush(); | ||
154 | response.Send(); | ||
155 | |||
156 | //if (!response.KeepAlive && response.ReuseContext) | ||
157 | // response.FreeContext(); | ||
158 | } | ||
159 | catch (Exception e) | ||
160 | { | ||
161 | m_log.Warn(String.Format("[POLL SERVICE WORKER THREAD]: Error ", e)); | ||
162 | } | ||
163 | } | ||
164 | } | ||
122 | } | 165 | } |
123 | } | 166 | } \ No newline at end of file |