bool socketSendData(JsNetwork *net, JsVar *connection, int sckt, JsVar **sendData) { char buf[64]; int a=1; if (!jsvIsEmptyString(*sendData)) { size_t bufLen = httpStringGet(*sendData, buf, sizeof(buf)); a = net->send(net, sckt, buf, bufLen); // Now cut what we managed to send off the beginning of sendData if (a>0) { JsVar *newSendData = 0; if (a < (int)jsvGetStringLength(*sendData)) { // we didn't send all of it... cut out what we did send newSendData = jsvNewFromStringVar(*sendData, (size_t)a, JSVAPPENDSTRINGVAR_MAXLENGTH); } else { // we sent all of it! Issue a drain event jsiQueueObjectCallbacks(connection, "#ondrain", &connection, 1); } jsvUnLock(*sendData); *sendData = newSendData; } } if (a<0) { // could just be busy which is ok jsError("Socket error %d while sending", a); return false; } return true; }
// returns 0 on success and a (negative) error number on failure int socketSendData(JsNetwork *net, JsVar *connection, int sckt, JsVar **sendData) { char *buf = alloca(net->chunkSize); // allocate on stack assert(!jsvIsEmptyString(*sendData)); size_t bufLen = httpStringGet(*sendData, buf, net->chunkSize); int num = netSend(net, sckt, buf, bufLen); if (num < 0) return num; // an error occurred // Now cut what we managed to send off the beginning of sendData if (num > 0) { JsVar *newSendData = 0; if (num < (int)jsvGetStringLength(*sendData)) { // we didn't send all of it... cut out what we did send newSendData = jsvNewFromStringVar(*sendData, (size_t)num, JSVAPPENDSTRINGVAR_MAXLENGTH); } else { // we sent all of it! Issue a drain event, unless we want to close, then we shouldn't // callback for more data bool wantClose = jsvGetBoolAndUnLock(jsvObjectGetChild(connection,HTTP_NAME_CLOSE,0)); if (!wantClose) { jsiQueueObjectCallbacks(connection, HTTP_NAME_ON_DRAIN, &connection, 1); } newSendData = jsvNewFromEmptyString(); } jsvUnLock(*sendData); *sendData = newSendData; } return 0; }
bool _http_send(SOCKET sckt, JsVar **sendData) { char buf[64]; int a=1; int len = (int)jsvGetStringLength(*sendData); if (len>0) { size_t bufLen = httpStringGet(*sendData, buf, sizeof(buf)); a = (int)send(sckt,buf,bufLen, MSG_NOSIGNAL); JsVar *newSendData = 0; if (a!=len) { newSendData = jsvNewFromEmptyString(); jsvAppendStringVar(newSendData, *sendData, a, JSVAPPENDSTRINGVAR_MAXLENGTH); } jsvUnLock(*sendData); *sendData = newSendData; } if (a<=0) { httpError("Socket error while sending"); return false; } return true; }