int mongrel2_ws_reply_upgrade(mongrel2_request *req, mongrel2_socket *socket){ bstring headers = mongrel2_ws_upgrade_headers(req); bstring body = mongrel2_ws_upgrade_body(req); mongrel2_reply_http(socket,req,headers,body); bdestroy(headers); bdestroy(body); return 0; }
int main(int argc, char **args){ char* SENDER = NULL; if (argc > 1 ) { SENDER = args[1]; } printf("Handler ID : %s\n", SENDER); bstring pull_addr = bfromcstr("tcp://127.0.0.1:9999"); bstring pub_addr = bfromcstr("tcp://127.0.0.1:9998"); mongrel2_ctx *ctx = mongrel2_init(1); // Yes for threads? mongrel2_socket *pull_socket = mongrel2_pull_socket(ctx); mongrel2_connect(pull_socket, bdata(pull_addr)); mongrel2_socket *pub_socket = mongrel2_pub_socket(ctx); mongrel2_connect(pub_socket, bdata(pub_addr)); if (SENDER != NULL) { mongrel2_set_identity(pub_socket, SENDER); } const bstring headers = bfromcstr("HTTP/1.1 200 OK\r\nDate: Fri, 07 Jan 2011 01:15:42 GMT\r\nStatus: 200 OK\r\nConnection: close"); mongrel2_request *request; while(1){ request = mongrel2_recv(pull_socket); btoupper(request->body); mongrel2_reply_http(pub_socket, request, headers, request->body); mongrel2_disconnect(pub_socket, request); mongrel2_request_finalize(request); } bdestroy(headers); bdestroy(pull_addr); bdestroy(pub_addr); mongrel2_close(pull_socket); mongrel2_close(pub_socket); mongrel2_deinit(ctx); return 0; }
int main(int argc, char **args){ bstring pull_addr = bfromcstr("tcp://127.0.0.1:8999"); bstring pub_addr = bfromcstr("tcp://127.0.0.1:8998"); mongrel2_ctx *ctx = mongrel2_init(1); // Yes for threads? mongrel2_socket *pull_socket = mongrel2_pull_socket(ctx,bdata(&SENDER)); mongrel2_connect(pull_socket, bdata(pull_addr)); mongrel2_socket *pub_socket = mongrel2_pub_socket(ctx); mongrel2_connect(pub_socket, bdata(pub_addr)); const bstring headers = bfromcstr("HTTP/1.1 200 OK\r\nDate: Fri, 07 Jan 2011 01:15:42 GMT\r\nStatus: 200 OK\r\nConnection: close"); mongrel2_request *request; // Need to set umask to allow file creation... then restore? Not sure! mode_t process_mask = umask(0); int retval; retval = mkfifo("handler_pipe", S_IRUSR); umask(process_mask); if(retval != 0){ switch(errno){ case EACCES : fprintf(stderr,"Insufficient permissions to create fifo handler_pipe"); case EEXIST : //fprintf(stderr,"handler_pipe already exists. That's cool tho."); goto no_mkfifo_error; case ENAMETOOLONG : fprintf(stderr,"handler_pipe is too long of a name. Unlikely!"); break; case ENOENT : fprintf(stderr,"path for handler_pipe does not exist"); break; case ENOSPC : fprintf(stderr,"no more room for handler_pipe"); break; case ENOTDIR : fprintf(stderr,"path for handler_pipe is not a directory"); break; case EROFS : fprintf(stderr,"handler_pipe cannot be created on read only fs"); break; default: fprintf(stderr,"Error creating fifo. Not sure what though. Sorry! %d",errno); break; } exit(EXIT_FAILURE); } no_mkfifo_error: fprintf(stdout,"Created handler_pipe AOK\n"); FILE *fifofd = fopen("handler_pipe","r"); if(fifofd == NULL){ fprintf(stderr,"Could not open handler_pipe"); exit(EXIT_FAILURE); } size_t read_size; request = mongrel2_recv(pull_socket); // A 1k buffer void* fifo_buffer = calloc(1024,1); //while(1){ read_size = fread(fifo_buffer, 1024, 1, fifofd); fprintf(stdout,"read_size from fifo: %zd", read_size); // z is for size_t's... weird! bdestroy(request->body); request->body = bfromcstralloc(1024,(const char*)fifo_buffer); mongrel2_reply_http(pub_socket, request, headers, request->body); mongrel2_disconnect(pub_socket, request); //} mongrel2_request_finalize(request); bdestroy(headers); bdestroy(pull_addr); bdestroy(pub_addr); mongrel2_close(pull_socket); mongrel2_close(pub_socket); mongrel2_deinit(ctx); return 0; }