| 272 | } |
| 273 | |
| 274 | void Server::handleHttpRequest() |
| 275 | { |
| 276 | auto* socket = qobject_cast<QTcpSocket*>(sender()); |
| 277 | if (!socket->canReadLine()) { |
| 278 | return; |
| 279 | } |
| 280 | |
| 281 | QTextStream ts(socket); |
| 282 | auto parts = ts.readLine().split(QRegularExpression("\\s+")); |
| 283 | if (parts.length() < 3 || parts[0] != "GET") { |
| 284 | return; |
| 285 | } |
| 286 | |
| 287 | // Connector script |
| 288 | if (parts[1] == "/minizinc-ide.js") { |
| 289 | QFile f(":/server/server/connector.js"); |
| 290 | f.open(QFile::ReadOnly | QFile::Text); |
| 291 | QTextStream c(&f); |
| 292 | ts << "HTTP/1.1 200 OK\r\n" |
| 293 | << "Content-Type: text/javascript\r\n" |
| 294 | << "\r\n" |
| 295 | << c.readAll(); |
| 296 | socket->close(); |
| 297 | return; |
| 298 | } |
| 299 | |
| 300 | QRegularExpression re("^/?(\\d+)(/.*)?$"); |
| 301 | auto p = QUrl::fromPercentEncoding(parts[1].toUtf8()); |
| 302 | auto match = re.match(p); |
| 303 | if (!match.hasMatch()) { |
| 304 | ts << "HTTP/1.1 404 OK\r\n" |
| 305 | << "\r\n" |
| 306 | << "File not found."; |
| 307 | socket->close(); |
| 308 | return; |
| 309 | } |
| 310 | |
| 311 | auto index = match.captured(1).toInt(); |
| 312 | if (index >= connectors.size()) { |
| 313 | ts << "HTTP/1.1 404 OK\r\n" |
| 314 | << "\r\n" |
| 315 | << "File not found."; |
| 316 | socket->close(); |
| 317 | return; |
| 318 | } |
| 319 | |
| 320 | auto path = match.captured(2); |
| 321 | // Window management page |
| 322 | if (path.isEmpty() || path == "index.html") { |
| 323 | QString title = connectors[index]->_label.toHtmlEscaped(); |
| 324 | QFile f(":/server/server/index.html"); |
| 325 | f.open(QFile::ReadOnly | QFile::Text); |
| 326 | QTextStream c(&f); |
| 327 | ts << "HTTP/1.1 200 OK\r\n" |
| 328 | << "Content-Type: text/html\r\n" |
| 329 | << "\r\n" |
| 330 | << c.readAll().arg(ws->serverUrl().toString()).arg(index).arg(title); |
| 331 | socket->close(); |
nothing calls this directly
no test coverage detected