static void setDefaultHeaders(HttpConn *conn) { HttpAuthType *ap; assert(conn); if (smatch(conn->protocol, "HTTP/1.0")) { conn->http10 = 1; } if (conn->username && conn->authType) { if ((ap = httpLookupAuthType(conn->authType)) != 0) { if ((ap->setAuth)(conn, conn->username, conn->password)) { conn->authRequested = 1; } } } if (conn->port != 80 && conn->port != 443) { httpAddHeader(conn, "Host", "%s:%d", conn->ip, conn->port); } else { httpAddHeaderString(conn, "Host", conn->ip); } httpAddHeaderString(conn, "Accept", "*/*"); if (conn->keepAliveCount > 0) { httpSetHeaderString(conn, "Connection", "Keep-Alive"); } else { httpSetHeaderString(conn, "Connection", "close"); } }
static void setDefaultHeaders(HttpStream *stream) { HttpAuthType *ap; assert(stream); if (stream->username && stream->authType && ((ap = httpLookupAuthType(stream->authType)) != 0)) { if ((ap->setAuth)(stream, stream->username, stream->password)) { stream->authRequested = 1; } } if (stream->net->protocol < 2) { if (stream->port != 80 && stream->port != 443) { if (schr(stream->ip, ':')) { httpAddHeader(stream, "Host", "[%s]:%d", stream->ip, stream->port); } else { httpAddHeader(stream, "Host", "%s:%d", stream->ip, stream->port); } } else { httpAddHeaderString(stream, "Host", stream->ip); } if (stream->keepAliveCount > 0) { httpSetHeaderString(stream, "Connection", "Keep-Alive"); } else { httpSetHeaderString(stream, "Connection", "close"); } } httpAddHeaderString(stream, "Accept", "*/*"); }
/* Define headers and create an empty header packet that will be filled later by the pipeline. */ static int setClientHeaders(HttpConn *conn) { HttpAuthType *authType; mprAssert(conn); if (smatch(conn->protocol, "HTTP/1.0")) { conn->http10 = 1; } if (conn->authType && (authType = httpLookupAuthType(conn->authType)) != 0) { (authType->setAuth)(conn); conn->setCredentials = 1; } if (conn->port != 80) { httpAddHeader(conn, "Host", "%s:%d", conn->ip, conn->port); } else { httpAddHeaderString(conn, "Host", conn->ip); } #if UNUSED if (conn->http10 && !smatch(conn->tx->method, "GET")) { conn->keepAliveCount = 0; } #endif if (conn->keepAliveCount > 0) { httpSetHeaderString(conn, "Connection", "Keep-Alive"); } else { httpSetHeaderString(conn, "Connection", "close"); } return 0; }
/* Check the response for authentication failures and redirections. Return true if a retry is requried. */ bool httpNeedRetry(HttpConn *conn, char **url) { HttpAuthType *authType; HttpRx *rx; mprAssert(conn->rx); *url = 0; rx = conn->rx; if (conn->state < HTTP_STATE_FIRST) { return 0; } if (rx->status == HTTP_CODE_UNAUTHORIZED) { if (conn->username == 0) { httpFormatError(conn, rx->status, "Authentication required"); } else if (conn->setCredentials) { httpFormatError(conn, rx->status, "Authentication failed"); } else { if (conn->authType && (authType = httpLookupAuthType(conn->authType)) != 0) { (authType->parseAuth)(conn); } return 1; } } else if (HTTP_CODE_MOVED_PERMANENTLY <= rx->status && rx->status <= HTTP_CODE_MOVED_TEMPORARILY && conn->followRedirects) { if (rx->redirect) { *url = rx->redirect; return 1; } httpFormatError(conn, rx->status, "Missing location header"); return -1; } return 0; }
/* Check the response for authentication failures and redirections. Return true if a retry is requried. */ PUBLIC bool httpNeedRetry(HttpConn *conn, char **url) { HttpRx *rx; HttpTx *tx; HttpAuthType *authType; assert(conn->rx); *url = 0; rx = conn->rx; tx = conn->tx; if (conn->state < HTTP_STATE_FIRST) { return 0; } if (rx->status == HTTP_CODE_UNAUTHORIZED) { if (conn->username == 0 || conn->authType == 0) { httpError(conn, rx->status, "Authentication required"); } else if (conn->authRequested && smatch(conn->authType, tx->authType)) { httpError(conn, rx->status, "Authentication failed"); } else { assert(httpClientConn(conn)); if (conn->authType && (authType = httpLookupAuthType(conn->authType)) != 0) { (authType->parseAuth)(conn, NULL, NULL); } return 1; } } else if (HTTP_CODE_MOVED_PERMANENTLY <= rx->status && rx->status <= HTTP_CODE_MOVED_TEMPORARILY && conn->followRedirects) { if (rx->redirect) { *url = rx->redirect; return 1; } httpError(conn, rx->status, "Missing location header"); return 0; } return 0; }
/* Check the response for authentication failures and redirections. Return true if a retry is requried. */ PUBLIC bool httpNeedRetry(HttpStream *stream, cchar **url) { HttpRx *rx; HttpAuthType *authType; assert(stream->rx); *url = 0; rx = stream->rx; if (stream->error || stream->state < HTTP_STATE_FIRST) { return 0; } if (rx->status == HTTP_CODE_UNAUTHORIZED) { if (stream->username == 0 || stream->authType == 0) { httpError(stream, rx->status, "Authentication required"); } else if (stream->authRequested && smatch(stream->authType, rx->authType)) { httpError(stream, rx->status, "Authentication failed, wrong authentication type"); } else { assert(httpClientStream(stream)); if (stream->authType && (authType = httpLookupAuthType(stream->authType)) != 0) { (authType->parseAuth)(stream, NULL, NULL); } return 1; } } else if (HTTP_CODE_MOVED_PERMANENTLY <= rx->status && rx->status <= HTTP_CODE_MOVED_TEMPORARILY && stream->followRedirects) { if (rx->redirect) { *url = rx->redirect; return 1; } httpError(stream, rx->status, "Missing location header"); return 0; } return 0; }