// when XmlDoc::inject() complets it calls this void doneInjectingWrapper9 ( void *state ) { Msg7 *msg7 = (Msg7 *)state; msg7->m_inUse = false; // shortcut XmlDoc *xd = &msg7->m_xd; GigablastRequest *gr = &msg7->m_gr; if ( gr->m_getSections && ! gr->m_gotSections ) { // do not re-call gr->m_gotSections = true; // new callback now, same state xd->m_callback1 = doneInjectingWrapper9; // and if it blocks internally, it will call // getInlineSectionVotingBuf until it completes then it will // call xd->m_callback xd->m_masterLoop = NULL; // get sections SafeBuf *buf = xd->getInlineSectionVotingBuf(); // if it returns -1 wait for it to call wrapper10 when done if ( buf == (void *)-1 ) return; // error? if ( ! buf ) log("inject: error getting sections: %s", mstrerror(g_errno)); } loop: // if we were injecting delimterized documents... char *delim = gr->m_contentDelim; if ( delim && ! delim[0] ) delim = NULL; if ( delim && msg7->m_start ) { // do another injection. returns false if it blocks if ( ! msg7->inject ( msg7->m_state , msg7->m_callback ) ) return; } if ( msg7->m_start && delim ) goto loop; // and we call the original caller msg7->m_callback ( msg7->m_state ); }
bool sendReply ( void *state ) { // get the state properly Msg7 *msg7= (Msg7 *) state; GigablastRequest *gr = &msg7->m_gr; // extract info from state TcpSocket *sock = gr->m_socket; XmlDoc *xd = &msg7->m_xd; // log it //if ( msg7->m_url[0] ) xd->logIt(); // msg7 has the docid for what we injected, iff g_errno is not set //long long docId = msg7->m_msg7.m_docId; //long hostId = msg7->m_msg7.m_hostId; long long docId = xd->m_docId; long hostId = 0;//msg7->m_msg7.m_hostId; // set g_errno to index code if ( xd->m_indexCodeValid && xd->m_indexCode && ! g_errno ) g_errno = xd->m_indexCode; char format = gr->m_hr.getReplyFormat(); // no url parm? if ( ! g_errno && ! gr->m_url && format != FORMAT_HTML ) g_errno = EMISSINGINPUT; if ( g_errno && g_errno != EDOCUNCHANGED ) { long save = g_errno; mdelete ( msg7, sizeof(Msg7) , "PageInject" ); delete (msg7); g_errno = save; char *msg = mstrerror(g_errno); return g_httpServer.sendErrorReply(sock,save,msg,NULL); } char abuf[320]; SafeBuf am(abuf,320,0,false); am.setLabel("injbuf"); char *ct = NULL; // a success reply, include docid and url i guess if ( format == FORMAT_XML ) { am.safePrintf("<response>\n"); am.safePrintf("\t<statusCode>%li</statusCode>\n", (long)g_errno); am.safePrintf("\t<statusMsg><![CDATA["); am.cdataEncode(mstrerror(g_errno)); am.safePrintf("]]></statusMsg>\n"); am.safePrintf("\t<docId>%lli</docId>\n",xd->m_docId); if ( gr->m_getSections ) { SafeBuf *secBuf = xd->getInlineSectionVotingBuf(); am.safePrintf("\t<htmlSrc><![CDATA["); if ( secBuf->length() ) am.cdataEncode(secBuf->getBufStart()); am.safePrintf("]]></htmlSrc>\n"); } am.safePrintf("</response>\n"); ct = "text/xml"; } if ( format == FORMAT_JSON ) { am.safePrintf("{\"response\":{\n"); am.safePrintf("\t\"statusCode\":%li,\n",(long)g_errno); am.safePrintf("\t\"statusMsg\":\""); am.jsonEncode(mstrerror(g_errno)); am.safePrintf("\",\n"); am.safePrintf("\t\"docId\":%lli,\n",xd->m_docId); if ( gr->m_getSections ) { SafeBuf *secBuf = xd->getInlineSectionVotingBuf(); am.safePrintf("\t\"htmlSrc\":\""); if ( secBuf->length() ) am.jsonEncode(secBuf->getBufStart()); am.safePrintf("\",\n"); } // subtract ",\n" am.m_length -= 2; am.safePrintf("\n}\n}\n"); ct = "application/json"; } if ( format == FORMAT_XML || format == FORMAT_JSON ) { mdelete ( msg7, sizeof(Msg7) , "PageInject" ); delete (msg7); return g_httpServer.sendDynamicPage(sock, am.getBufStart(), am.length(), 0, false, ct ); } // // debug // /* // now get the meta list, in the process it will print out a // bunch of junk into msg7->m_pbuf if ( xd->m_docId ) { char *metalist = xd->getMetaList ( 1,1,1,1,1,1 ); if ( ! metalist || metalist==(void *)-1){char *xx=NULL;*xx=0;} // print it out SafeBuf *pbuf = &msg7->m_sbuf; xd->printDoc( pbuf ); bool status = g_httpServer.sendDynamicPage( msg7->m_socket , pbuf->getBufStart(), pbuf->length() , -1, //cachtime false ,//postreply? NULL, //ctype -1 , //httpstatus NULL,//cookie "utf-8"); // delete the state now mdelete ( st , sizeof(Msg7) , "PageInject" ); delete (st); // return the status return status; } */ // // end debug // char *url = gr->m_url; // . if we're talking w/ a robot he doesn't care about this crap // . send him back the error code (0 means success) if ( url && gr->m_shortReply ) { char buf[1024*32]; char *p = buf; // return docid and hostid if ( ! g_errno ) p += sprintf ( p , "0,docId=%lli,hostId=%li," , docId , hostId ); // print error number here else p += sprintf ( p , "%li,0,0,", (long)g_errno ); // print error msg out, too or "Success" p += sprintf ( p , "%s", mstrerror(g_errno)); mdelete ( msg7, sizeof(Msg7) , "PageInject" ); delete (msg7); return g_httpServer.sendDynamicPage ( sock,buf, gbstrlen(buf) , -1/*cachetime*/); } SafeBuf sb; // print admin bar g_pages.printAdminTop ( &sb, sock , &gr->m_hr ); // print a response msg if rendering the page after a submission if ( g_errno ) sb.safePrintf ( "<center>Error injecting url: <b>%s[%i]</b>" "</center>", mstrerror(g_errno) , g_errno); else if ( (gr->m_url&&gr->m_url[0]) || (gr->m_queryToScrape&&gr->m_queryToScrape[0]) ) sb.safePrintf ( "<center><b>Sucessfully injected %s" "</center><br>" , xd->m_firstUrl.m_url ); // print the table of injection parms g_parms.printParmTable ( &sb , sock , &gr->m_hr ); // clear g_errno, if any, so our reply send goes through g_errno = 0; // calculate buffer length //long bufLen = p - buf; // nuke state mdelete ( msg7, sizeof(Msg7) , "PageInject" ); delete (msg7); // . send this page // . encapsulates in html header and tail // . make a Mime // . i thought we need -2 for cacheTime, but i guess not return g_httpServer.sendDynamicPage (sock, sb.getBufStart(), sb.length(), -1/*cachetime*/); }