⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wsphttp.c

📁 SyncML ToolKits,学习syncml的参考工具包.非常好用.
💻 C
📖 第 1 页 / 共 3 页
字号:
   response->authChallenge = (WspWWWAuthenticate_t *) xppMalloc(sizeof(WspWWWAuthenticate_t));   if (response->authChallenge == NULL)      return SML_ERR_A_XPT_MEMORY;   xppMemset(response->authChallenge, 0, sizeof(WspWWWAuthenticate_t));   rc = parseAuthChallenge(response->authChallenge, tempValue);   return rc;} /* End initializeAuthChallenge() */unsigned int parseAuthChallenge(WspWWWAuthenticate_t *auth, const char *source){   unsigned int rc         = SML_ERR_OK;   const char  *sPtr       = source;   const char  *ePtr       = NULL;   int          authLen    = 0;   XPTDEBUG(("    parseAuthChallenge(%lx, %s)\n", (unsigned long) auth, source));   if ((auth == NULL) || (source == NULL))      return SML_ERR_A_XPT_INVALID_PARM;   ePtr = sPtr + xppStrlen(source);   auth->authType = getMetaInfoValue(source, "Basic");   XPTDEBUG(("    parseAuthChallenge() auth->authType = %lx\n", (unsigned long) auth->authType));   if ((auth->authType != NULL) && (!xppStrcmp(auth->authType, ""))) {      xppFree(auth->authType);      auth->authType = (char *) xppMalloc (xppStrlen("Basic") + 1);      if (auth->authType != NULL)         xppStrcpy(auth->authType, "Basic");   } else {      auth->authType = getMetaInfoValue(source, "Digest");      if ((auth->authType != NULL) && (!xppStrcmp(auth->authType, ""))) {         xppFree(auth->authType);         auth->authType = (char *) xppMalloc (xppStrlen("Basic") + 1);         if (auth->authType != NULL)            xppStrcpy(auth->authType, "Digest");      }   }   if (auth->authType == NULL)      return SML_ERR_A_XPT_COMMUNICATION;      /* Unsupported auth type */   authLen = xppStrlen(auth->authType);   /* Bump buffer pointer past auth type in source */   while ((sPtr < ePtr) && (xppStrncmp(sPtr, auth->authType, authLen) !=0)) {      sPtr++;   }   if (!xppStrncmp(sPtr, auth->authType, authLen)) {      sPtr += authLen;      while ((sPtr < ePtr) && (!xppStrncmp(sPtr, " ", 1)))         sPtr++;      if (sPtr >= ePtr)         sPtr = source;   } else      sPtr = source;   auth->realm = getHeaderParmValue("realm", sPtr);   if (!xppStrcmp(auth->authType, "Digest")) {      auth->domain = getHeaderParmValue("domain", sPtr);      auth->nonce  = getHeaderParmValue("nonce", sPtr);      auth->opaque = getHeaderParmValue("opaque", sPtr);      auth->stale  = getHeaderParmValue("stale", sPtr);      auth->algorithm = getHeaderParmValue("algorithm", sPtr);      auth->qop    = getHeaderParmValue("qop", sPtr);   } /* End Digest Authentication parms */   XPTDEBUG(("    parseAuthChallenge() returns %u\n", rc));   return rc;} /* End parseAuthChallenge() */unsigned int validateResponse(WspHttpParms_t *parms){   XPTDEBUG(("    validateResponse(%lx)\n", (unsigned long) parms));   /* Accept    * Verify that server response complies, else reject response               */   /* Accept-Charset    * Verify that server response complies, else reject response               */   /* Accept-Encoding    * Verify any server encoding complies, else reject response    * It's up to client to decode - binding is just conduit                    */   /* Accept-Language    * Verify any server encoding complies, else reject response    * It's up to client to decode - binding is just conduit                    */   return SML_ERR_OK;} /* End validateResponse() */void releaseRequestParms(WspHttpRequestParms_t *request){   XPTDEBUG(("    releaseRequestParms(%lx)\n", (unsigned long) request));   if (request == NULL)      return;   xppFree(request->accept);   xppFree(request->acceptCharset);   xppFree(request->from);   xppFree(request->acceptEncoding);   xppFree(request->acceptLanguage);   xppFree(request->host);   xppFree(request->referer);   xppFree(request->composedHeader);   releaseAuthorizationParms(request->authorization);   xppFree(request);} /* End releaseRequestParms() */void releaseAuthorizationParms(WspAuthorization_t *parms){   XPTDEBUG(("    releaseAuthorizationParms(%lx)\n", (unsigned long) parms));   if (parms == NULL)      return;   xppFree(parms->authType);   xppFree(parms->userid);   xppFree(parms->password);   xppFree(parms->realm);   xppFree(parms->cnonce);   xppFree(parms->opaque);   xppFree(parms);} /* End releaseAuthorizationParms() */void releaseResponseParms(WspHttpResponseParms_t *response){   XPTDEBUG(("    releaseResponseParms(%lx)\n", (unsigned long) response));   if (response == NULL)      return;   xppFree(response->cacheControl);   xppFree(response->location);   xppFree(response->retryAfter);   releaseChallengeParms(response->authChallenge);   releaseAuthenticationParms(response->authVerification);   xppFree(response);} /* End releaseResponseParms() */void releaseChallengeParms(WspWWWAuthenticate_t *parms){   XPTDEBUG(("    releaseChallengeParms(%lx)\n", (unsigned long) parms));   if (parms == NULL)      return;   xppFree(parms->authType);   xppFree(parms->realm);   xppFree(parms->domain);   xppFree(parms->nonce);   xppFree(parms->opaque);   xppFree(parms->stale);   xppFree(parms->algorithm);   xppFree(parms->qop);   xppFree(parms);} /* End releaseChallengeParms() */void releaseAuthenticationParms(WspAuthentication_t *parms){   XPTDEBUG(("    releaseAuthenticationParms(%lx)\n", (unsigned long) parms));   if (parms == NULL)      return;   xppFree(parms->nextNonce);   xppFree(parms->qop);   xppFree(parms->rspAuth);   xppFree(parms->cnonce);   xppFree(parms->nc);   xppFree(parms);} /* End releaseAuthenticationParms() *//* * Returns a pointer to the address in the buffer where the next token * could begin, i.e. points to immediately after the end of the tag * that was just added to the buffer */void addTag(char *buffer, const char *tagName, const char *tagValue){   if ((buffer == NULL) || (tagName == NULL) || (tagValue == NULL))      return;   xppStrcat(buffer, tagName);   xppStrcat(buffer, ": ");   xppStrcat(buffer, tagValue);   xppStrcat(buffer, NL);   return;} /* End addTag() */int calcStaticHeaderSize(WspHttpRequestParms_t *request){   int length = 0;   XPTDEBUG(("    calcStaticHeaderSize(%lx)\n", (unsigned long) request));   length += getTagLen("Cache-Control", D_CACHE_CONTROL);   length += getTagLen("Accept", request->accept);   length += getTagLen("Accept-Charset", request->acceptCharset);   length += getTagLen("From", request->from);   length += getTagLen("User-Agent", D_USER_AGENT);   length += getTagLen("Accept-Encoding", request->acceptEncoding);   length += getTagLen("Accept-Language", request->acceptLanguage);   length += getTagLen("host", request->host);   length += xppStrlen(NL);   length += 1;            /* For null terminator */   return length;} /* End calcStaticHeaderSize() */int getTagLen(const char *tagName, const char *tagValue){   int length = 0;   if ((tagName == NULL) || (tagValue == NULL))      return 0;   length = length + xppStrlen(tagName) + xppStrlen(": ") + xppStrlen(tagValue) + xppStrlen(NL);   return length;} /* end getTagLen() *//** * 1.  Parse settings parms on selectProtocol to: *       - establish client-specific parms *       - initialize default values for non-specified parms * 2.  Compose request header for invoke requests, given content-type, *     content-length *       - who handles referer?  We should, but how does this class know *         it's needed? * 3.  Parse response header * 3.5 Provide caller methods for verifying response, i.e. *       - caller sees 401, wants to set auth info and reget request headers *       - caller wants to verify response authinfo? *       - tell caller of auth failures (same as challenge?) *       - tell caller of other reject conditions * 4.  Accept changes to request auth info?  If we don't prime with *     the auth info and get challenged, the caller will need to compose *     a response to the challenge. **/void auth(WspHttpParms_t *parmPtr){   if (parmPtr->request->authorization != NULL)  {      /* Binding MUST support, Specified by client, or not included            */      /* Verify domain/realm before sending                                    */      if (parmPtr->request->authorization->authType != NULL) {         xppStrcat(parmPtr->request->composedHeader, "Authorization: ");         xppStrcat(parmPtr->request->composedHeader, parmPtr->request->authorization->authType);         xppStrcat(parmPtr->request->composedHeader, " ");         if (!xppStrcmp(parmPtr->request->authorization->authType, "BASIC")) {         /* base64-encode userid:password */            xppStrcat(parmPtr->request->composedHeader, parmPtr->request->authorization->userid);            xppStrcat(parmPtr->request->composedHeader, ":");            xppStrcat(parmPtr->request->composedHeader, parmPtr->request->authorization->password);            xppStrcat(parmPtr->request->composedHeader, NL);         } else if (!xppStrcmp(parmPtr->request->authorization->authType, "DIGEST")) {            xppStrcat(parmPtr->request->composedHeader, " username=");            xppStrcat(parmPtr->request->composedHeader, parmPtr->request->authorization->userid);            xppStrcat(parmPtr->request->composedHeader, " realm=");            xppStrcat(parmPtr->request->composedHeader, parmPtr->request->authorization->realm);            xppStrcat(parmPtr->request->composedHeader, "nonce = \"" "\" ");            xppStrcat(parmPtr->request->composedHeader, "uri=\"transaction->uri\" ");            xppStrcat(parmPtr->request->composedHeader, "response=\"request-digest\" ");            xppStrcat(parmPtr->request->composedHeader, "algorithm = \"<MD5|MD5-sess|token>\" ");            xppStrcat(parmPtr->request->composedHeader, "cnonce=\"");            xppStrcat(parmPtr->request->composedHeader, parmPtr->request->authorization->cnonce);            xppStrcat(parmPtr->request->composedHeader, "\" ");            xppStrcat(parmPtr->request->composedHeader, "opaque = \"");            xppStrcat(parmPtr->request->composedHeader, parmPtr->request->authorization->opaque);            xppStrcat(parmPtr->request->composedHeader, "\" ");            xppStrcat(parmPtr->request->composedHeader, "qop=\"<auth|auth-int|token>\" ");            xppStrcat(parmPtr->request->composedHeader, "nc=<nonceCountValue> ");            xppStrcat(parmPtr->request->composedHeader, NL);         } /* End digest auth  */      } /* End valid auth type */   } /* End authorization */} /* End auth() */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -