Skip to content

Commit 9453880

Browse files
committed
Display streamed response chunks when running config generator
1 parent 52a4c62 commit 9453880

File tree

2 files changed

+52
-32
lines changed

2 files changed

+52
-32
lines changed

src/server.py

+11-4
Original file line numberDiff line numberDiff line change
@@ -238,12 +238,19 @@ def generate_configs():
238238
"tenant": current_handler.tenant,
239239
}
240240
params.update(request.args)
241-
response = requests.post(
241+
req = requests.post(
242242
urllib.parse.urljoin(config_generator_url, "generate_configs"),
243-
params=params
243+
params=params,
244+
stream=True
245+
)
246+
def req_lines():
247+
for line in req.iter_lines(decode_unicode=True):
248+
yield line + "\n"
249+
return Response(
250+
stream_with_context(req_lines()),
251+
status=req.status_code,
252+
content_type=req.headers.get('Content-Type')
244253
)
245-
246-
return (response.text, response.status_code)
247254

248255
@app.route('/qgis_server_logs', methods=['POST'])
249256
def qgis_server_logs():

src/templates/home.html

+41-28
Original file line numberDiff line numberDiff line change
@@ -4,22 +4,27 @@
44
{{super()}}
55
<script type="text/javascript">
66
$(function() {
7-
var clearAlert = function(alertSelector) {
8-
$('#alerts').find(alertSelector).find('> div').remove();
9-
};
107

11-
var showAlert = function(alertSelector, html) {
12-
$('#alerts').find(alertSelector).append(html);
8+
var setupLogElement = function(tabSelector, title, type="light") {
9+
// Clear previous
10+
$('#logs').find(tabSelector).find('> div').remove();
11+
12+
var container = $('<div>').addClass('alert alert-' + type).attr('role', 'alert');
13+
var title = $('<strong>').text(title);
14+
var contents = $('<pre>');
15+
container.append(title).append(contents);
16+
$('#logs').find(tabSelector).append(container);
17+
return contents;
1318
}
1419

15-
var setupAPIRequestButton = function(buttonSelector, url, options, alertSelector, titleSuccess, titleError) {
20+
var setupAPIRequestButton = function(buttonSelector, url, options, tabSelector, titleSuccess, titleError) {
1621
var button = $(buttonSelector);
1722
button.click(function() {
18-
clearAlert(alertSelector);
1923
button.attr("disabled", true);
2024
$(document.body).css("cursor", 'wait');
25+
$(tabSelector + "-tab").click();
2126

22-
let reqUrl = url;
27+
var reqUrl = url;
2328
options.forEach(option => {
2429
if ($('#' + option).prop('checked')) {
2530
reqUrl += (reqUrl.includes('?') ? '&' : '?') + option + '=1';
@@ -28,26 +33,40 @@
2833
}
2934
});
3035

36+
var logElement = setupLogElement(tabSelector, titleSuccess);
37+
3138
// call Admin GUI service
32-
$.post(
33-
reqUrl,
39+
var last_chunk_len = null;
40+
$.ajax({
41+
xhr: function()
3442
{
43+
var xhr = new window.XMLHttpRequest();
44+
xhr.addEventListener("progress", function(e){
45+
var response_chunk;
46+
var response = e.currentTarget.response;
47+
if (last_chunk_len === false)
48+
{
49+
response_chunk = response;
50+
last_chunk_len = response.length;
51+
} else {
52+
response_chunk = response.substring(last_chunk_len);
53+
last_chunk_len = response.length;
54+
}
55+
logElement.append(response_chunk);
56+
}, false);
57+
return xhr;
58+
},
59+
type: 'POST',
60+
url: reqUrl,
61+
data: {
3562
csrf_token: '{{ csrf_token() }}'
3663
}
37-
).done(function(data, status) {
64+
}).done(function(data, status) {
3865
button.prop("disabled", false);
3966
$(document.body).css("cursor", '');
4067

4168
// show response
42-
var html = '';
43-
html += '<div class="alert alert-light" role="alert">';
44-
html += '<strong>' + titleSuccess + '</strong>';
45-
html += '<pre>';
46-
html += data;
47-
html += '</pre>';
48-
html += '</div>';
49-
showAlert(alertSelector, html);
50-
$(alertSelector + "-tab").click();
69+
logElement.html(data);
5170
}).fail(function(jqXHR, status) {
5271
button.prop("disabled", false);
5372
$(document.body).css("cursor", '');
@@ -67,13 +86,7 @@
6786
msg = '<pre>' + jqXHR.responseText + '</pre>';
6887
}
6988

70-
var html = '';
71-
html += '<div class="alert alert-danger" role="alert">';
72-
html += '<strong>' + titleError + '</strong><br/>';
73-
html += '<div style="font-family: monospace">' + msg + '</div>';
74-
html += '</div>';
75-
showAlert(alertSelector, html);
76-
$(alertSelector + "-tab").click();
89+
setupLogElement(tabSelector, titleError, 'danger').html(msg);
7790
});
7891
});
7992
}
@@ -166,7 +179,7 @@ <h1>{{ admin_gui_title }}</h1>
166179
</button>
167180
{% endif %}
168181

169-
<div id="alerts" class="row mt-4">
182+
<div id="logs" class="row mt-4">
170183
<nav>
171184
<div class="nav nav-tabs" id="nav-tab" role="tablist">
172185
{% if have_config_generator %}

0 commit comments

Comments
 (0)