Ejemplo n.º 1
0
int Logic::process(void) {
    if (!m_operationPermitted)
        return CYNARA_API_OPERATION_NOT_ALLOWED;

    bool completed;
    while (true) {
        int ret = completeConnection(completed);
        if (!completed)
            return ret;
        if (processOut() && processIn())
            return CYNARA_API_SUCCESS;
        onDisconnected();
        if (!connect())
            return CYNARA_API_SERVICE_NOT_AVAILABLE;
    }
}
Ejemplo n.º 2
0
    /**
     * @brief Implementation of internal transition DEVS
     * function
     */
    void internalTransition(vd::Time t) override
    {
        processOut(t, INTERNAL);
        updateGuards(t, INTERNAL);

        switch (devs_state) {
        case INIT:
            devs_state = COMPUTE;
            break;
        case COMPUTE:
            devs_state = OUTPUT;
            break;
        case OUTPUT:
            devs_state = COMPUTE;
            break;
        default:
            throw vu::InternalError("default 2");
        }
        processIn(t, INTERNAL);
    }
Ejemplo n.º 3
0
    void confluentTransitions(vd::Time t,
            const vd::ExternalEventList& ext) override
    {
        processOut(t, CONFLUENT);
        handleExtEvt(t, ext);
        updateGuards(t, CONFLUENT);

        switch (devs_state) {
        case INIT:
            devs_state = COMPUTE;
            break;
        case COMPUTE:
            devs_state=OUTPUT;
            break;
        case OUTPUT:
            devs_state = COMPUTE;
            break;
        default:
            throw vu::InternalError("default confluent");
        }
        processIn(t, CONFLUENT);
    }
Ejemplo n.º 4
0
    void externalTransition(const vd::ExternalEventList& event,
            vd::Time t) override
    {
        processOut(t, EXTERNAL);
        handleExtEvt(t, event);
        updateGuards(t, EXTERNAL);

        switch (devs_state) {
        case INIT:
            throw vu::InternalError("Error 3");
            break;
        case COMPUTE:
            devs_state = COMPUTE;
            break;
        case OUTPUT:
            throw vu::InternalError("Error 4");
            break;
        default:
            throw vu::InternalError("default");
        }
        processIn(t, EXTERNAL);
    }
Ejemplo n.º 5
0
 /************** DEVS functions *****************/
 vd::Time init(vd::Time time) override
 {
     devs_state = INIT;
     processIn(time, INTERNAL);
     return timeAdvance();
 }
Ejemplo n.º 6
0
	void processIn()
	{
		QByteArray buf = sock->readAll();

		if(state == ReadHeader)
		{
			if(inBuf.size() + buf.size() > MAX_HEADERS_SIZE)
			{
				inBuf.clear();
				respondBadRequest("Request header too large.");
				return;
			}

			inBuf += buf;

			// look for double newline
			int at = -1;
			int next;
			for(int n = 0; n < inBuf.size(); ++n)
			{
				if(n + 1 < inBuf.size() && qstrncmp(inBuf.data() + n, "\n\n", 2) == 0)
				{
					at = n + 1;
					next = n + 2;
					break;
				}
				else if(n + 2 < inBuf.size() && qstrncmp(inBuf.data() + n, "\n\r\n", 3) == 0)
				{
					at = n + 1;
					next = n + 3;
					break;
				}
			}

			if(at != -1)
			{
				QByteArray headerData = inBuf.mid(0, at);
				reqBody = inBuf.mid(next);
				inBuf.clear();

				if(!processHeaderData(headerData))
				{
					respondBadRequest("Failed to parse request header.");
					return;
				}

				bool methodAssumesBody = (method != "HEAD" && method != "GET" && method != "DELETE");
				if(!reqHeaders.contains("Content-Length") && (reqHeaders.contains("Transfer-Encoding") || methodAssumesBody))
				{
					respondLengthRequired("Request requires Content-Length.");
					return;
				}

				if(reqHeaders.contains("Content-Length"))
				{
					bool ok;
					contentLength = reqHeaders.get("Content-Length").toInt(&ok);
					if(!ok)
					{
						respondBadRequest("Bad Content-Length.");
						return;
					}

					if(contentLength > MAX_BODY_SIZE)
					{
						respondBadRequest("Request body too large.");
						return;
					}

					if(reqHeaders.get("Expect") == "100-continue")
					{
						QByteArray respData = "HTTP/";
						if(version1dot0)
							respData += "1.0 ";
						else
							respData += "1.1 ";
						respData += "100 Continue\r\n\r\n";

						pendingWritten += respData.size();
						sock->write(respData);
					}

					state = ReadBody;
					processIn();
				}
				else
				{
					state = WriteBody;
					emit ready();
				}
			}
		}
		else if(state == ReadBody)
		{
			reqBody += buf;

			if(reqBody.size() > contentLength)
			{
				respondBadRequest("Request body exceeded Content-Length.");
				return;
			}

			if(reqBody.size() == contentLength)
			{
				state = WriteBody;
				emit ready();
			}
		}
	}