int mongrel2_ws_reply(mongrel2_socket *pub_socket, mongrel2_request *req, bstring data){ bstring payload = bstrcpy(data); // ! and # are the fill characters. You should not see these if the data is correct bInsertChrs(payload, blength(payload), 1, TERM_CHAR, '!'); bInsertChrs(payload, 0, 1, START_CHAR, '#'); mongrel2_reply(pub_socket,req,payload); // mongrel2_ws_debug(payload); bdestroy(payload); return 0; }
int mongrel2_ws_reply(mongrel2_socket *pub_socket, mongrel2_request *req, bstring data){ size_t req_len = blength(data); uint8_t *req_data = (uint8_t*)bdata(data); size_t payload_len = 0; uint8_t *payload_data = NULL; // Simplest code but seems to be unsafe with chrome 14? int retval = mongrel2_ws_frame_create(0,req_len,&payload_len,&payload_data); if(retval != 0){ fprintf(stderr,"mongrel2_ws_reply failed with errno %d\n",retval); return -1; } mongrel2_ws_frame_set_payload(payload_len,payload_data,req_len,req_data); mongrel2_ws_frame_set_opcode(payload_len,payload_data,OP_TEXT); mongrel2_ws_frame_set_fin(payload_len,payload_data); // Instead, let's chunk it to a bunch of small messages // int fullchunks = req_len % WEBSOCKET_SMALL_MAX; // int leftoverbytes = req_len / WEBSOCKET_SMALL_MAX; // bstring chunk; // for(int i=0; i<fullchunks; i++){ // uint8_t chunk_payload[WEBSOCKET_SMALL_MAX]; // chunk = bmidstr(data,i*WEBSOCKET_SMALL_MAX,i*WEBSOCKET_SMALL_MAX+WEBSOCKET_SMALL_MAX-1); // fullchunks--; // } #ifndef NDEBUG mongrel2_ws_frame_debug(payload_len,payload_data); #endif bstring outgoing = blk2bstr(payload_data,payload_len); assert(blength(outgoing) == payload_len); mongrel2_reply(pub_socket,req,outgoing); free(payload_data); bdestroy(outgoing); return 0; }
int mongrel2_ws_reply_upgrade(mongrel2_request *req, mongrel2_socket *socket){ bstring headers = mongrel2_ws_upgrade_headers(req); mongrel2_reply(socket,req,headers); bdestroy(headers); return 0; }