/*JSON{ "type":"method", "class" : "httpCRq", "name" : "write", "generate" : "jswrap_httpCRq_write", "params" : [ [ "data", "JsVar", "A string containing data to send"] ], "return" : ["bool", "For note compatibility, the boolean false. When the send buffer is empty, a `drain` event will be sent" ] }*/ bool jswrap_httpCRq_write(JsVar *parent, JsVar *data) { httpClientRequestWrite(parent, data); return false; }
/*JSON{ "type":"method", "class" : "httpCRq", "name" : "write", "generate" : "jswrap_httpCRq_write", "params" : [ [ "data", "JsVar", "A string containing data to send"] ] }*/ void jswrap_httpCRq_write(JsVar *parent, JsVar *data) { httpClientRequestWrite(parent, data); }
void httpClientRequestEnd(JsVar *httpClientReqVar) { httpClientRequestWrite(httpClientReqVar, 0); // force sendData to be made JsVar *options = jsvObjectGetChild(httpClientReqVar, HTTP_NAME_OPTIONS_VAR, false); SOCKET sckt = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (sckt == INVALID_SOCKET) { httpError("Unable to create socket\n"); jsvUnLock(jsvObjectSetChild(httpClientReqVar, HTTP_NAME_CLOSENOW, jsvNewFromBool(true))); } jsvUnLock(jsvObjectSetChild(httpClientReqVar, HTTP_NAME_SOCKET, jsvNewFromInteger(sckt+1))); unsigned short port = (unsigned short)jsvGetIntegerAndUnLock(jsvObjectGetChild(options, "port", false)); #ifdef USE_CC3000 sockaddr sin; sin.sa_family = AF_INET; sin.sa_data[0] = (port & 0xFF00) >> 8; sin.sa_data[1] = (port & 0x00FF); #else sockaddr_in sin; sin.sin_family = AF_INET; sin.sin_port = htons( port ); #endif char hostName[128]; JsVar *hostNameVar = jsvObjectGetChild(options, "host", false); jsvGetString(hostNameVar, hostName, sizeof(hostName)); jsvUnLock(hostNameVar); unsigned long host_addr = 0; #ifdef USE_CC3000 gethostbyname(hostName, strlen(hostName), &host_addr); #else struct hostent * host_addr_p = gethostbyname(hostName); if (host_addr_p) host_addr = *((int*)*host_addr_p->h_addr_list); #endif /* getaddrinfo is newer than this? * * struct addrinfo * result; * error = getaddrinfo("www.example.com", NULL, NULL, &result); * if (0 != error) * fprintf(stderr, "error %s\n", gai_strerror(error)); * */ if(!host_addr) { httpError("Unable to locate host"); jsvUnLock(jsvObjectSetChild(httpClientReqVar, HTTP_NAME_CLOSENOW, jsvNewFromBool(true))); jsvUnLock(options); return; } // turn on non-blocking mode #ifdef WIN_OS u_long n = 1; ioctlsocket(sckt,FIONBIO,&n); #elif defined(USE_CC3000) int param; param = SOCK_ON; setsockopt(sckt, SOL_SOCKET, SOCKOPT_RECV_NONBLOCK, ¶m, sizeof(param)); // enable nonblock param = 5; // ms setsockopt(sckt, SOL_SOCKET, SOCKOPT_RECV_TIMEOUT, ¶m, sizeof(param)); // set a timeout #else int flags = fcntl(sckt, F_GETFL); if (flags < 0) { httpError("Unable to retrieve socket descriptor status flags"); jsvUnLock(jsvObjectSetChild(httpClientReqVar, HTTP_NAME_CLOSENOW, jsvNewFromBool(true))); jsvUnLock(options); return; } if (fcntl(sckt, F_SETFL, flags | O_NONBLOCK) < 0) httpError("Unable to set socket descriptor status flags\n"); #endif #ifdef USE_CC3000 sin.sa_data[5] = (host_addr) & 0xFF; // First octet of destination IP sin.sa_data[4] = (host_addr>>8) & 0xFF; // Second Octet of destination IP sin.sa_data[3] = (host_addr>>16) & 0xFF; // Third Octet of destination IP sin.sa_data[2] = (host_addr>>24) & 0xFF; // Fourth Octet of destination IP #else sin.sin_addr.s_addr = host_addr; #endif //uint32_t a = sin.sin_addr.s_addr; //_DEBUG_PRINT( cout<<"Port :"<<sin.sin_port<<", Address : "<< sin.sin_addr.s_addr<<endl); int res = connect (sckt,(const struct sockaddr *)&sin, sizeof(sockaddr_in) ); if (res == SOCKET_ERROR) { #ifdef WIN_OS int err = WSAGetLastError(); #else int err = errno; #endif if (err != EINPROGRESS && err != EWOULDBLOCK) { httpError("Connect failed\n" ); jsvUnLock(jsvObjectSetChild(httpClientReqVar, HTTP_NAME_CLOSENOW, jsvNewFromBool(true))); } } jsvUnLock(options); }