void uWSGI::processRequest(wsgi_request *req) { CachedRequest *cache = static_cast<CachedRequest *>(req->async_environ); // wsgi_req->uri containg the whole URI it /foo/bar?query=null // so we use path_info, maybe it would be better to just build our // Request->uri() from it, but we need to run a performance test uint16_t pos = notSlash(req->path_info, req->path_info_len); const QString path = QString::fromLatin1(req->path_info + pos, req->path_info_len - pos); const QString serverAddress = QString::fromLatin1(req->host, req->host_len); const QByteArray query = QByteArray::fromRawData(req->query_string, req->query_string_len); const QString method = QString::fromLatin1(req->method, req->method_len); const QString protocol = QString::fromLatin1(req->protocol, req->protocol_len); const QString remoteAddress = QString::fromLatin1(req->remote_addr, req->remote_addr_len); const QString remoteUser = QString::fromLatin1(req->remote_user, req->remote_user_len); quint16 remotePort = 0; Headers headers; // we scan the table in reverse, as updated values are at the end for (int i = req->var_cnt - 1; i > 0; i -= 2) { struct iovec &name = req->hvec[i - 1]; struct iovec &value = req->hvec[i]; if (!uwsgi_startswith(static_cast<char *>(name.iov_base), const_cast<char *>("HTTP_"), 5)) { headers.setHeader(QString::fromLatin1(static_cast<char *>(name.iov_base) + 5, name.iov_len - 5), QString::fromLatin1(static_cast<char *>(value.iov_base), value.iov_len)); } else if (!remotePort && !uwsgi_strncmp(const_cast<char *>("REMOTE_PORT"), 11, static_cast<char *>(name.iov_base), name.iov_len)) { remotePort = QByteArray::fromRawData(static_cast<char *>(value.iov_base), value.iov_len).toUInt(); } } if (req->content_type_len > 0) { headers.setContentType(QString::fromLatin1(req->content_type, req->content_type_len)); } if (req->encoding_len > 0) { headers.setContentEncoding(QString::fromLatin1(req->encoding, req->encoding_len)); } QIODevice *body; if (req->post_file) { // qCDebug(CUTELYST_UWSGI) << "Post file available:" << req->post_file; QFile *upload = cache->bodyFile; if (upload->open(req->post_file, QIODevice::ReadOnly)) { body = upload; } else { // qCDebug(CUTELYST_UWSGI) << "Could not open post file:" << upload->errorString(); body = cache->bodyBufferedUWSGI; body->open(QIODevice::ReadOnly | QIODevice::Unbuffered); } } else if (uwsgi.post_buffering) { // qCDebug(CUTELYST_UWSGI) << "Post buffering size:" << uwsgi.post_buffering; body = cache->bodyUWSGI; body->reset(); } else { // BodyBufferedUWSGI is an IO device which will // only consume the body when some of it's functions // is called, this is because here we can't seek // the body. body = cache->bodyBufferedUWSGI; body->open(QIODevice::ReadOnly | QIODevice::Unbuffered); } Engine::processRequest(method, path, query, protocol, req->https_len, serverAddress, remoteAddress, remotePort, remoteUser, headers, req->start_of_request, body, req); body->close(); }