| OLD | NEW |
| 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 library analysis_server.src.get_handler; | 5 library analysis_server.src.get_handler; |
| 6 | 6 |
| 7 import 'dart:collection'; | 7 import 'dart:collection'; |
| 8 import 'dart:convert'; | 8 import 'dart:convert'; |
| 9 import 'dart:io'; | 9 import 'dart:io'; |
| 10 import 'dart:math'; | 10 import 'dart:math'; |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 80 * The path used to request an overlay contents. | 80 * The path used to request an overlay contents. |
| 81 */ | 81 */ |
| 82 static const String OVERLAY_PATH = '/overlay'; | 82 static const String OVERLAY_PATH = '/overlay'; |
| 83 | 83 |
| 84 /** | 84 /** |
| 85 * The path used to request overlays information. | 85 * The path used to request overlays information. |
| 86 */ | 86 */ |
| 87 static const String OVERLAYS_PATH = '/overlays'; | 87 static const String OVERLAYS_PATH = '/overlays'; |
| 88 | 88 |
| 89 /** | 89 /** |
| 90 * The path used to request overall performance information. |
| 91 */ |
| 92 static const String PERFORMANCE_PATH = '/performance'; |
| 93 |
| 94 /** |
| 90 * Query parameter used to represent the cache state to search for, when | 95 * Query parameter used to represent the cache state to search for, when |
| 91 * accessing [CACHE_STATE_PATH]. | 96 * accessing [CACHE_STATE_PATH]. |
| 92 */ | 97 */ |
| 93 static const String STATE_QUERY_PARAM = 'state'; | 98 static const String STATE_QUERY_PARAM = 'state'; |
| 94 | 99 |
| 95 /** | 100 /** |
| 96 * Query parameter used to represent the context to search for, when | 101 * Query parameter used to represent the context to search for, when |
| 97 * accessing [CACHE_ENTRY_PATH] or [CACHE_STATE_PATH]. | 102 * accessing [CACHE_ENTRY_PATH] or [CACHE_STATE_PATH]. |
| 98 */ | 103 */ |
| 99 static const String CONTEXT_QUERY_PARAM = 'context'; | 104 static const String CONTEXT_QUERY_PARAM = 'context'; |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 169 } else if (path == COMPLETION_PATH) { | 174 } else if (path == COMPLETION_PATH) { |
| 170 _returnCompletionInfo(request); | 175 _returnCompletionInfo(request); |
| 171 } else if (path == CONTEXT_PATH) { | 176 } else if (path == CONTEXT_PATH) { |
| 172 _returnContextInfo(request); | 177 _returnContextInfo(request); |
| 173 } else if (path == ELEMENT_PATH) { | 178 } else if (path == ELEMENT_PATH) { |
| 174 _returnElement(request); | 179 _returnElement(request); |
| 175 } else if (path == OVERLAY_PATH) { | 180 } else if (path == OVERLAY_PATH) { |
| 176 _returnOverlayContents(request); | 181 _returnOverlayContents(request); |
| 177 } else if (path == OVERLAYS_PATH) { | 182 } else if (path == OVERLAYS_PATH) { |
| 178 _returnOverlaysInfo(request); | 183 _returnOverlaysInfo(request); |
| 184 } else if (path == PERFORMANCE_PATH) { |
| 185 _returnPerformance(request); |
| 179 } else { | 186 } else { |
| 180 _returnUnknownRequest(request); | 187 _returnUnknownRequest(request); |
| 181 } | 188 } |
| 182 } | 189 } |
| 183 | 190 |
| 184 /** | 191 /** |
| 185 * Return the folder being managed by the given [analysisServer] that matches | 192 * Return the folder being managed by the given [analysisServer] that matches |
| 186 * the given [contextFilter], or `null` if there is none. | 193 * the given [contextFilter], or `null` if there is none. |
| 187 */ | 194 */ |
| 188 Folder _findFolder(AnalysisServer analysisServer, String contextFilter) { | 195 Folder _findFolder(AnalysisServer analysisServer, String contextFilter) { |
| (...skipping 550 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 739 _overlayContents[count] = contents; | 746 _overlayContents[count] = contents; |
| 740 }); | 747 }); |
| 741 }); | 748 }); |
| 742 buffer.write('<tr><td colspan="2">Total: $count entries.</td></tr>'); | 749 buffer.write('<tr><td colspan="2">Total: $count entries.</td></tr>'); |
| 743 buffer.write('</table>'); | 750 buffer.write('</table>'); |
| 744 }); | 751 }); |
| 745 }); | 752 }); |
| 746 } | 753 } |
| 747 | 754 |
| 748 /** | 755 /** |
| 756 * Return a response displaying overall performance information. |
| 757 */ |
| 758 void _returnPerformance(HttpRequest request) { |
| 759 AnalysisServer analysisServer = _server.analysisServer; |
| 760 if (analysisServer == null) { |
| 761 return _returnFailure(request, 'Analysis server is not running'); |
| 762 } |
| 763 _writeResponse(request, (StringBuffer buffer) { |
| 764 _writePage( |
| 765 buffer, |
| 766 'Analysis Server - Performance', |
| 767 [], |
| 768 (StringBuffer buffer) { |
| 769 buffer.write('<h3>Communication Performance</h3>'); |
| 770 _writeTwoColumns(buffer, (StringBuffer buffer) { |
| 771 ServerPerformance perf = analysisServer.performanceDuringStartup; |
| 772 int requestCount = perf.requestCount; |
| 773 num averageLatency = |
| 774 requestCount > 0 ? (perf.requestLatency / requestCount).round() :
0; |
| 775 int maximumLatency = perf.maxLatency; |
| 776 num slowRequestPercent = |
| 777 requestCount > 0 ? (perf.slowRequestCount * 100 / requestCount).ro
und() : 0; |
| 778 buffer.write('<h4>Startup</h4>'); |
| 779 buffer.write('<table>'); |
| 780 _writeRow( |
| 781 buffer, |
| 782 [requestCount, 'requests'], |
| 783 classes: ["right", null]); |
| 784 _writeRow( |
| 785 buffer, |
| 786 [averageLatency, 'ms average latency'], |
| 787 classes: ["right", null]); |
| 788 _writeRow( |
| 789 buffer, |
| 790 [maximumLatency, 'ms maximum latency'], |
| 791 classes: ["right", null]); |
| 792 _writeRow( |
| 793 buffer, |
| 794 [slowRequestPercent, '% > 150 ms latency'], |
| 795 classes: ["right", null]); |
| 796 if (analysisServer.performanceAfterStartup != null) { |
| 797 int startupTime = |
| 798 analysisServer.performanceAfterStartup.startTime - |
| 799 perf.startTime; |
| 800 _writeRow( |
| 801 buffer, |
| 802 [startupTime, 'ms for initial analysis to complete']); |
| 803 } |
| 804 buffer.write('</table>'); |
| 805 }, (StringBuffer buffer) { |
| 806 ServerPerformance perf = analysisServer.performanceAfterStartup; |
| 807 if (perf == null) { |
| 808 return; |
| 809 } |
| 810 int requestCount = perf.requestCount; |
| 811 num averageLatency = |
| 812 requestCount > 0 ? (perf.requestLatency * 10 / requestCount).round
() / 10 : 0; |
| 813 int maximumLatency = perf.maxLatency; |
| 814 num slowRequestPercent = |
| 815 requestCount > 0 ? (perf.slowRequestCount * 100 / requestCount).ro
und() : 0; |
| 816 buffer.write('<h4>Current</h4>'); |
| 817 buffer.write('<table>'); |
| 818 _writeRow( |
| 819 buffer, |
| 820 [requestCount, 'requests'], |
| 821 classes: ["right", null]); |
| 822 _writeRow( |
| 823 buffer, |
| 824 [averageLatency, 'ms average latency'], |
| 825 classes: ["right", null]); |
| 826 _writeRow( |
| 827 buffer, |
| 828 [maximumLatency, 'ms maximum latency'], |
| 829 classes: ["right", null]); |
| 830 _writeRow( |
| 831 buffer, |
| 832 [slowRequestPercent, '% > 150 ms latency'], |
| 833 classes: ["right", null]); |
| 834 buffer.write('</table>'); |
| 835 }); |
| 836 }); |
| 837 }); |
| 838 } |
| 839 |
| 840 /** |
| 749 * Return a response indicating the status of the analysis server. | 841 * Return a response indicating the status of the analysis server. |
| 750 */ | 842 */ |
| 751 void _returnServerStatus(HttpRequest request) { | 843 void _returnServerStatus(HttpRequest request) { |
| 752 _writeResponse(request, (StringBuffer buffer) { | 844 _writeResponse(request, (StringBuffer buffer) { |
| 753 _writePage(buffer, 'Analysis Server - Status', [], (StringBuffer buffer) { | 845 _writePage(buffer, 'Analysis Server - Status', [], (StringBuffer buffer) { |
| 754 if (_writeServerStatus(buffer)) { | 846 if (_writeServerStatus(buffer)) { |
| 755 _writeAnalysisStatus(buffer); | 847 _writeAnalysisStatus(buffer); |
| 756 _writeEditStatus(buffer); | 848 _writeEditStatus(buffer); |
| 757 _writeExecutionStatus(buffer); | 849 _writeExecutionStatus(buffer); |
| 758 _writeRecentOutput(buffer); | 850 _writeRecentOutput(buffer); |
| 759 } | 851 } |
| 760 }); | 852 }); |
| 761 }); | 853 }); |
| 762 } | 854 } |
| 763 | 855 |
| 764 /** | 856 /** |
| 765 * Return an error in response to an unrecognized request received by the HTTP | 857 * Return an error in response to an unrecognized request received by the HTTP |
| 766 * server. | 858 * server. |
| 767 */ | 859 */ |
| 768 void _returnUnknownRequest(HttpRequest request) { | 860 void _returnUnknownRequest(HttpRequest request) { |
| 769 HttpResponse response = request.response; | 861 _writeResponse(request, (StringBuffer buffer) { |
| 770 response.statusCode = HttpStatus.NOT_FOUND; | 862 _writePage(buffer, 'Analysis Server', [], (StringBuffer buffer) { |
| 771 response.headers.contentType = _htmlContent; | 863 buffer.write('<h3>Pages</h3>'); |
| 772 response.write('<html>'); | 864 buffer.write('<p>'); |
| 773 response.write('<head>'); | 865 buffer.write(_makeLink(COMPLETION_PATH, {}, 'Completion data')); |
| 774 response.write('<title>Dart Analysis Server - Page Not Found</title>'); | 866 buffer.write('</p>'); |
| 775 response.write('</head>'); | 867 buffer.write('<p>'); |
| 776 response.write('<body>'); | 868 buffer.write(_makeLink(PERFORMANCE_PATH, {}, 'Performance')); |
| 777 response.write('<h1>Page Not Found</h1>'); | 869 buffer.write('</p>'); |
| 778 response.write('<p>Try one of these links instead:</p>'); | 870 buffer.write('<p>'); |
| 779 response.write('<ul>'); | 871 buffer.write(_makeLink(STATUS_PATH, {}, 'Server status')); |
| 780 response.write('<li><a href="$STATUS_PATH">Server Status</a></li>'); | 872 buffer.write('</p>'); |
| 781 response.write('<li><a href="$COMPLETION_PATH">Completion Stats</a></li>'); | 873 }); |
| 782 response.write('<ul>'); | 874 }); |
| 783 response.write('</body>'); | |
| 784 response.write('</html>'); | |
| 785 response.close(); | |
| 786 } | 875 } |
| 787 | 876 |
| 788 /** | 877 /** |
| 789 * Return a two digit decimal representation of the given non-negative integer | 878 * Return a two digit decimal representation of the given non-negative integer |
| 790 * [value]. | 879 * [value]. |
| 791 */ | 880 */ |
| 792 String _twoDigit(int value) { | 881 String _twoDigit(int value) { |
| 793 if (value < 10) { | 882 if (value < 10) { |
| 794 return '0$value'; | 883 return '0$value'; |
| 795 } | 884 } |
| (...skipping 588 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1384 } else if (value is Element) { | 1473 } else if (value is Element) { |
| 1385 String link = | 1474 String link = |
| 1386 _makeLink(ELEMENT_PATH, linkParameters, value.runtimeType.toString()); | 1475 _makeLink(ELEMENT_PATH, linkParameters, value.runtimeType.toString()); |
| 1387 buffer.write('<i>$link</i>'); | 1476 buffer.write('<i>$link</i>'); |
| 1388 } else { | 1477 } else { |
| 1389 buffer.write(HTML_ESCAPE.convert(value.toString())); | 1478 buffer.write(HTML_ESCAPE.convert(value.toString())); |
| 1390 buffer.write(' <i>(${value.runtimeType.toString()})</i>'); | 1479 buffer.write(' <i>(${value.runtimeType.toString()})</i>'); |
| 1391 } | 1480 } |
| 1392 } | 1481 } |
| 1393 } | 1482 } |
| OLD | NEW |