/* function get info(): Object */ static EjsObj *http_info(Ejs *ejs, EjsHttp *hp, int argc, EjsObj **argv) { EjsObj *obj; char *key, *next, *value; if (hp->conn && hp->conn->sock) { obj = ejsCreateEmptyPot(ejs); for (key = stok(mprGetSocketState(hp->conn->sock), ",", &next); key; key = stok(NULL, ",", &next)) { stok(key, "=", &value); ejsSetPropertyByName(ejs, obj, EN(key), ejsCreateStringFromAsc(ejs, value)); } return obj; } return ESV(null); }
/* Handle IO on the connection. Initially the conn->dispatcher will be set to the server->dispatcher and the first I/O event will be handled on the server thread (or main thread). A request handler may create a new conn->dispatcher and transfer execution to a worker thread if required. */ PUBLIC void httpIO(HttpConn *conn, int eventMask) { MprSocket *sp; sp = conn->sock; if (conn->destroyed) { /* Connection has been destroyed */ return; } if (conn->state < HTTP_STATE_PARSED && mprShouldDenyNewRequests()) { httpDestroyConn(conn); return; } assert(conn->tx); assert(conn->rx); #if DEPRECATED || 1 /* Just IO state asserting */ if (conn->io) { assert(!conn->io); return; } conn->io = 1; #endif if ((eventMask & MPR_WRITABLE) && conn->connectorq) { httpResumeQueue(conn->connectorq); } if (eventMask & MPR_READABLE) { readPeerData(conn); } if (sp->secured && !conn->secure) { conn->secure = 1; if (sp->peerCert) { httpTrace(conn, "connection.ssl", "context", "msg:'Connection secured with peer certificate'," \ "secure:true,cipher:'%s',peerName:'%s',subject:'%s',issuer:'%s',session:'%s'", sp->cipher, sp->peerName, sp->peerCert, sp->peerCertIssuer, sp->session); } else { httpTrace(conn, "connection.ssl", "context", "msg:'Connection secured without peer certificate',secure:true,cipher:'%s',session:'%s'", sp->cipher, sp->session); } if (mprGetLogLevel() >= 5) { mprLog("info http ssl", 5, "SSL State: %s", mprGetSocketState(sp)); } } /* Process one or more complete requests in the packet */ do { /* This is and must be the only place httpProtocol is ever called */ httpProtocol(conn); } while (conn->endpoint && conn->state == HTTP_STATE_COMPLETE && prepForNext(conn)); /* When a request completes, prepForNext will reset the state to HTTP_STATE_BEGIN */ if (conn->state < HTTP_STATE_PARSED && conn->endpoint && (mprIsSocketEof(conn->sock) || (conn->keepAliveCount <= 0))) { httpDestroyConn(conn); } else if (!mprIsSocketEof(conn->sock) && conn->async && !conn->delay) { httpEnableConnEvents(conn); } conn->io = 0; }