/* get response */ DMSG(stderr, "HEADER:\n"); len = sslclient_recv_header(client, &ptr); /* header */ if(ptr) { HTTPHeader *header; DMSG(stderr, ptr); header = http_parse_header(ptr); len = header->content_length; DMSG(stderr, "content length: %d\n", len); http_header_destroy(header); xfree(ptr); } else { DMSG(stderr, "no header found\n\r"); } memset(buf, 0, sizeof(buf)); fp = fopen("contacts.xml", "w"); len -= (ret = sslclient_recv(client, buf, sizeof(buf)-1)); ctxt = xmlCreatePushParserCtxt(NULL, NULL, buf, ret, "contacts.xml"); DMSG(stderr, "RESPONSE:\n"); fprintf(fp, buf); if(ctxt == NULL) { fprintf(stderr, "failed to create parser context"); return 0; } while(len > 0) { memset(buf, 0, sizeof(buf)); len -= (ret=sslclient_recv(client, buf, sizeof(buf)-1)); fprintf(fp, buf); xmlParseChunk(ctxt, buf, ret, 0); } fclose(fp); xmlParseChunk(ctxt, buf, 0, 1); sslclient_destroy(client, FALSE); client = NULL; doc = ctxt->myDoc; len = ctxt->wellFormed; xmlFreeParserCtxt(ctxt); count += _cl_parse_contacts(cl, doc); xmlFreeDoc(doc); xmlCleanupParser(); DMSG(stderr, "contact xml parsing done: %s\n", len?"good":"malformed"); } _cl_sort_contacts(cl); cl_save(cl, contactfile); cleanup: xfree(req); xfree(header); return count; }/*}}}*/ int _cl_load_soapreq_ms(CL *cl, const char *lastchange, char **req, bool FullRequest)/*{{{*/ { int size; int ret, len; char *encticket; xfree(*req); if(FullRequest) { size = sizeof(ms_request_full) + strlen(cl->ticket) * 2; *req = (char*)xmalloc(size); } else { size = sizeof(ms_request) + strlen(cl->ticket) * 2; *req = (char*)xmalloc(size); } if(*req == NULL) { fprintf(stderr, "load_soapreq: bad xmalloc\n"); return 0; } memset(*req, 0, size); ret = 0; len = strlen(cl->ticket); ret = len*2; encticket = (char*)xmalloc(ret); memset(encticket, 0, ret); htmlEncodeEntities((unsigned char*)encticket, &ret, (unsigned char*)cl->ticket, &len, 0); ret = 0; if(FullRequest) ret = sprintf(*req, ms_request_full, encticket); else ret = sprintf(*req, ms_request, encticket, cl->lastchange); xfree(encticket); return ret; }/*}}}*/ int _cl_load_soapreq_ab(CL *cl, const char *lastchange, char **req, bool FullRequest)/*{{{*/ { int ret, len; char *encticket; int size = sizeof(ab_request) + strlen(cl->ticket)*2; xfree(*req); *req = (char*)xmalloc(size); ret = 0; len = strlen(cl->ticket); ret = len*2; encticket = (char*)xmalloc(ret); memset(encticket, 0, ret); htmlEncodeEntities((unsigned char*)encticket, &ret, (unsigned char*)cl->ticket, &len, 0); ret = sprintf(*req, ab_request, encticket); xfree(encticket); return ret; }/*}}}*/
static void processNode(xmlTextReaderPtr reader, Buffer * buf) { int type = xmlTextReaderNodeType(reader); if (type == XML_TEXT_NODE) { unsigned char *s = xmlTextReaderReadString(reader); int slen = strlen(s); char enc[512]; int enclen = 512; if (!htmlEncodeEntities(enc, &enclen, s, &slen, 0)) { buffer_in(buf, enc, enclen); if (enc[enclen-1] != ' ') { buffer_in(buf, " ", 1); } } free(s); } }
/* get response */ DMSG(stderr, "HEADER:\n"); len = sslclient_recv_header(client, &ptr); /* header */ if(ptr) { HTTPHeader *header; DMSG(stderr, ptr); header = http_parse_header(ptr); len = header->content_length; DMSG(stderr, "content length: %d\n", len); http_header_destroy(header); xfree(ptr); } else { DMSG(stderr, "no header found\n\r"); } memset(buf, 0, sizeof(buf)); fp = fopen("contacts.xml", "w"); len -= (ret = sslclient_recv(client, buf, sizeof(buf)-1)); ctxt = xmlCreatePushParserCtxt(NULL, NULL, buf, ret, "contacts.xml"); DMSG(stderr, "RESPONSE:\n"); fprintf(fp, buf); if(ctxt == NULL) { fprintf(stderr, "failed to create parser context"); return 0; } while(len > 0) { memset(buf, 0, sizeof(buf)); len -= (ret=sslclient_recv(client, buf, sizeof(buf)-1)); fprintf(fp, buf); xmlParseChunk(ctxt, buf, ret, 0); } fclose(fp); xmlParseChunk(ctxt, buf, 0, 1); sslclient_destroy(client, FALSE); client = NULL; doc = ctxt->myDoc; len = ctxt->wellFormed; xmlFreeParserCtxt(ctxt); count += _cl_parse_contacts(cl, doc); xmlFreeDoc(doc); xmlCleanupParser(); DMSG(stderr, "contact xml parsing done: %s\n", len?"good":"malformed"); } _cl_sort_contacts(cl); cl_save(cl, contactfile); cleanup: xfree(req); xfree(header); return count; }/*}}}*/ int _cl_load_soapreq_ms(CL *cl, const char *lastchange, char **req, bool FullRequest)/*{{{*/ { int size; int ret, len; char *encticket; xfree(*req); if(FullRequest) { size = sizeof(ms_request_full) + strlen(cl->ticket) * 2; *req = (char*)xmalloc(size); } else { size = sizeof(ms_request) + strlen(cl->ticket) * 2; *req = (char*)xmalloc(size); } if(*req == NULL) { fprintf(stderr, "load_soapreq: bad xmalloc\n"); return 0; } memset(*req, 0, size); ret = 0; len = strlen(cl->ticket); ret = len*2; encticket = (char*)xmalloc(ret); memset(encticket, 0, ret); htmlEncodeEntities((unsigned char*)encticket, &ret, (unsigned char*)cl->ticket, &len, 0); ret = 0; if(FullRequest) ret = sprintf(*req, ms_request_full, encticket); else ret = sprintf(*req, ms_request, encticket, cl->lastchange); xfree(encticket); return ret; }/*}}}*/