diff options
Diffstat (limited to 'OpenSim/Framework')
-rw-r--r-- | OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs | 74 | ||||
-rw-r--r-- | OpenSim/Framework/Util.cs | 51 |
2 files changed, 118 insertions, 7 deletions
diff --git a/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs b/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs index 98e7f0e..878e2fd 100644 --- a/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs +++ b/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs | |||
@@ -457,6 +457,10 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
457 | // This has to be here to prevent a Linux/Mono crash | 457 | // This has to be here to prevent a Linux/Mono crash |
458 | m_log.WarnFormat("[BASE HTTP SERVER] XmlRpcRequest issue {0}.\nNOTE: this may be spurious on Linux.", e); | 458 | m_log.WarnFormat("[BASE HTTP SERVER] XmlRpcRequest issue {0}.\nNOTE: this may be spurious on Linux.", e); |
459 | } | 459 | } |
460 | catch (IOException e) | ||
461 | { | ||
462 | m_log.Warn("[BASE HTTP SERVER] XmlRpcRequest issue: " + e.Message); | ||
463 | } | ||
460 | return; | 464 | return; |
461 | } | 465 | } |
462 | 466 | ||
@@ -464,7 +468,8 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
464 | { | 468 | { |
465 | foreach (string strAccept in request.AcceptTypes) | 469 | foreach (string strAccept in request.AcceptTypes) |
466 | { | 470 | { |
467 | if (strAccept.Contains("application/llsd+xml")) | 471 | if (strAccept.Contains("application/llsd+xml") || |
472 | strAccept.Contains("application/llsd+json")) | ||
468 | { | 473 | { |
469 | //m_log.Info("[Debug BASE HTTP SERVER]: Found an application/llsd+xml accept header"); | 474 | //m_log.Info("[Debug BASE HTTP SERVER]: Found an application/llsd+xml accept header"); |
470 | HandleLLSDRequests(request, response); | 475 | HandleLLSDRequests(request, response); |
@@ -483,12 +488,14 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
483 | 488 | ||
484 | case "application/llsd+xml": | 489 | case "application/llsd+xml": |
485 | case "application/xml+llsd": | 490 | case "application/xml+llsd": |
491 | case "application/llsd+json": | ||
486 | //m_log.Info("[Debug BASE HTTP SERVER]: found a application/llsd+xml content type"); | 492 | //m_log.Info("[Debug BASE HTTP SERVER]: found a application/llsd+xml content type"); |
487 | HandleLLSDRequests(request, response); | 493 | HandleLLSDRequests(request, response); |
488 | return; | 494 | return; |
489 | 495 | ||
490 | case "text/xml": | 496 | case "text/xml": |
491 | case "application/xml": | 497 | case "application/xml": |
498 | case "application/json": | ||
492 | default: | 499 | default: |
493 | //m_log.Info("[Debug BASE HTTP SERVER]: in default handler"); | 500 | //m_log.Info("[Debug BASE HTTP SERVER]: in default handler"); |
494 | // Point of note.. the DoWeHaveA methods check for an EXACT path | 501 | // Point of note.. the DoWeHaveA methods check for an EXACT path |
@@ -529,9 +536,9 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
529 | // with the minimum first | 536 | // with the minimum first |
530 | m_log.WarnFormat("[BASE HTTP SERVER]: HandleRequest threw {0}.\nNOTE: this may be spurious on Linux", e); | 537 | m_log.WarnFormat("[BASE HTTP SERVER]: HandleRequest threw {0}.\nNOTE: this may be spurious on Linux", e); |
531 | } | 538 | } |
532 | catch (EndOfStreamException e) | 539 | catch (IOException e) |
533 | { | 540 | { |
534 | m_log.ErrorFormat("[BASE HTTP SERVER]: HandleRequest() threw {0}", e); | 541 | m_log.ErrorFormat("[BASE HTTP SERVER] HandleRequest() threw ", e); |
535 | } | 542 | } |
536 | catch (InvalidOperationException e) | 543 | catch (InvalidOperationException e) |
537 | { | 544 | { |
@@ -760,6 +767,10 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
760 | // This has to be here to prevent a Linux/Mono crash | 767 | // This has to be here to prevent a Linux/Mono crash |
761 | m_log.WarnFormat("[BASE HTTP SERVER] XmlRpcRequest issue {0}.\nNOTE: this may be spurious on Linux.", e); | 768 | m_log.WarnFormat("[BASE HTTP SERVER] XmlRpcRequest issue {0}.\nNOTE: this may be spurious on Linux.", e); |
762 | } | 769 | } |
770 | catch (IOException e) | ||
771 | { | ||
772 | m_log.Warn("[BASE HTTP SERVER] XmlRpcRequest issue: " + e.Message); | ||
773 | } | ||
763 | } | 774 | } |
764 | return; | 775 | return; |
765 | //responseString = "Error"; | 776 | //responseString = "Error"; |
@@ -793,6 +804,10 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
793 | // This has to be here to prevent a Linux/Mono crash | 804 | // This has to be here to prevent a Linux/Mono crash |
794 | m_log.WarnFormat("[BASE HTTP SERVER] XmlRpcRequest issue {0}.\nNOTE: this may be spurious on Linux.", e); | 805 | m_log.WarnFormat("[BASE HTTP SERVER] XmlRpcRequest issue {0}.\nNOTE: this may be spurious on Linux.", e); |
795 | } | 806 | } |
807 | catch (IOException e) | ||
808 | { | ||
809 | m_log.Warn("[BASE HTTP SERVER] XmlRpcRequest issue: " + e.Message); | ||
810 | } | ||
796 | } | 811 | } |
797 | } | 812 | } |
798 | 813 | ||
@@ -823,7 +838,7 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
823 | } | 838 | } |
824 | try | 839 | try |
825 | { | 840 | { |
826 | llsdRequest = OSDParser.DeserializeLLSDXml(requestBody); | 841 | llsdRequest = OSDParser.Deserialize(requestBody); |
827 | } | 842 | } |
828 | catch (Exception ex) | 843 | catch (Exception ex) |
829 | { | 844 | { |
@@ -873,10 +888,10 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
873 | } | 888 | } |
874 | else | 889 | else |
875 | { | 890 | { |
876 | response.ContentType = "application/llsd+xml"; | 891 | // Select an appropriate response format |
877 | //m_log.Info("[Debug BASE HTTP SERVER]: Response: " + llsdResponse.ToString()); | 892 | buffer = BuildLLSDResponse(request, response, llsdResponse); |
878 | buffer = OSDParser.SerializeLLSDXmlBytes(llsdResponse); | ||
879 | } | 893 | } |
894 | |||
880 | response.SendChunked = false; | 895 | response.SendChunked = false; |
881 | response.ContentLength64 = buffer.Length; | 896 | response.ContentLength64 = buffer.Length; |
882 | response.ContentEncoding = Encoding.UTF8; | 897 | response.ContentEncoding = Encoding.UTF8; |
@@ -912,6 +927,47 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
912 | } | 927 | } |
913 | } | 928 | } |
914 | 929 | ||
930 | private byte[] BuildLLSDResponse(OSHttpRequest request, OSHttpResponse response, OSD llsdResponse) | ||
931 | { | ||
932 | if (request.AcceptTypes != null && request.AcceptTypes.Length > 0) | ||
933 | { | ||
934 | foreach (string strAccept in request.AcceptTypes) | ||
935 | { | ||
936 | switch (strAccept) | ||
937 | { | ||
938 | case "application/llsd+xml": | ||
939 | case "application/xml": | ||
940 | case "text/xml": | ||
941 | response.ContentType = strAccept; | ||
942 | return OSDParser.SerializeLLSDXmlBytes(llsdResponse); | ||
943 | case "application/llsd+json": | ||
944 | case "application/json": | ||
945 | response.ContentType = strAccept; | ||
946 | return Encoding.UTF8.GetBytes(OSDParser.SerializeJsonString(llsdResponse)); | ||
947 | } | ||
948 | } | ||
949 | } | ||
950 | |||
951 | if (!String.IsNullOrEmpty(request.ContentType)) | ||
952 | { | ||
953 | switch (request.ContentType) | ||
954 | { | ||
955 | case "application/llsd+xml": | ||
956 | case "application/xml": | ||
957 | case "text/xml": | ||
958 | response.ContentType = request.ContentType; | ||
959 | return OSDParser.SerializeLLSDXmlBytes(llsdResponse); | ||
960 | case "application/llsd+json": | ||
961 | case "application/json": | ||
962 | response.ContentType = request.ContentType; | ||
963 | return Encoding.UTF8.GetBytes(OSDParser.SerializeJsonString(llsdResponse)); | ||
964 | } | ||
965 | } | ||
966 | |||
967 | response.ContentType = "application/llsd+json"; | ||
968 | return Encoding.UTF8.GetBytes(OSDParser.SerializeJsonString(llsdResponse)); | ||
969 | } | ||
970 | |||
915 | /// <summary> | 971 | /// <summary> |
916 | /// Checks if we have an Exact path in the LLSD handlers for the path provided | 972 | /// Checks if we have an Exact path in the LLSD handlers for the path provided |
917 | /// </summary> | 973 | /// </summary> |
@@ -1404,6 +1460,10 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
1404 | // This has to be here to prevent a Linux/Mono crash | 1460 | // This has to be here to prevent a Linux/Mono crash |
1405 | m_log.WarnFormat("[BASE HTTP SERVER] XmlRpcRequest issue {0}.\nNOTE: this may be spurious on Linux.", e); | 1461 | m_log.WarnFormat("[BASE HTTP SERVER] XmlRpcRequest issue {0}.\nNOTE: this may be spurious on Linux.", e); |
1406 | } | 1462 | } |
1463 | catch (IOException e) | ||
1464 | { | ||
1465 | m_log.Warn("[BASE HTTP SERVER] XmlRpcRequest issue: " + e.Message); | ||
1466 | } | ||
1407 | } | 1467 | } |
1408 | } | 1468 | } |
1409 | 1469 | ||
diff --git a/OpenSim/Framework/Util.cs b/OpenSim/Framework/Util.cs index 0a9b67d..65d4f4d 100644 --- a/OpenSim/Framework/Util.cs +++ b/OpenSim/Framework/Util.cs | |||
@@ -1111,5 +1111,56 @@ namespace OpenSim.Framework | |||
1111 | return null; | 1111 | return null; |
1112 | } | 1112 | } |
1113 | 1113 | ||
1114 | public static string[] Glob(string path) | ||
1115 | { | ||
1116 | string vol=String.Empty; | ||
1117 | |||
1118 | if (Path.VolumeSeparatorChar != Path.DirectorySeparatorChar) | ||
1119 | { | ||
1120 | string[] vcomps = path.Split(new char[] {Path.VolumeSeparatorChar}, 2, StringSplitOptions.RemoveEmptyEntries); | ||
1121 | |||
1122 | if (vcomps.Length > 1) | ||
1123 | { | ||
1124 | path = vcomps[1]; | ||
1125 | vol = vcomps[0]; | ||
1126 | } | ||
1127 | } | ||
1128 | |||
1129 | string[] comps = path.Split(new char[] {Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar}, StringSplitOptions.RemoveEmptyEntries); | ||
1130 | |||
1131 | // Glob | ||
1132 | |||
1133 | path = vol; | ||
1134 | if (vol != String.Empty) | ||
1135 | path += new String(new char[] {Path.VolumeSeparatorChar, Path.DirectorySeparatorChar}); | ||
1136 | else | ||
1137 | path = new String(new char[] {Path.DirectorySeparatorChar}); | ||
1138 | |||
1139 | List<string> paths = new List<string>(); | ||
1140 | List<string> found = new List<string>(); | ||
1141 | paths.Add(path); | ||
1142 | |||
1143 | foreach (string c in comps) | ||
1144 | { | ||
1145 | List<string> addpaths = new List<string>(); | ||
1146 | foreach (string p in paths) | ||
1147 | { | ||
1148 | string[] dirs = Directory.GetDirectories(p, c); | ||
1149 | |||
1150 | if (dirs.Length != 0) | ||
1151 | { | ||
1152 | foreach (string dir in dirs) | ||
1153 | addpaths.Add(Path.Combine(path, dir)); | ||
1154 | } | ||
1155 | |||
1156 | string[] files = Directory.GetFiles(p, c); | ||
1157 | foreach (string f in files) | ||
1158 | found.Add(f); | ||
1159 | } | ||
1160 | paths = addpaths; | ||
1161 | } | ||
1162 | |||
1163 | return found.ToArray(); | ||
1164 | } | ||
1114 | } | 1165 | } |
1115 | } | 1166 | } |