Beispiel #1
0
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;
}
Beispiel #2
0
// 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;
}
Beispiel #3
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;
}