// Swap this with main -- this is a protocol test
int test(int argc, char **args){
    /**
     * Example from page 8 of the web socket protocol RFC : http://www.whatwg.org/specs/web-socket-protocol/
     */
    char *headers = "{\"PATH\":\"/dds_stream\",\"host\":\"localhost:6767\","
                    "\"sec-websocket-key1\":\"18x 6]8vM;54 *(5:  {   U1]8  z [  8\","
                    "\"origin\":\"http://localhost:6767\",\"x-forwarded-for\":\"::1\","
                    "\"upgrade\":\"WebSocket\",\"connection\":\"Upgrade\","
                    "\"sec-websocket-key2\":\"1_ tx7X d  <  nw  334J702) 7]o}` 0\","
                    "\"METHOD\":\"GET\",\"VERSION\":\"HTTP/1.1\",\"URI\":\"/dds_stream\","
                    "\"PATTERN\":\"/dds_stream\"}";
    char *body = "Tm[K T2u";
    mongrel2_request *req = calloc(1,sizeof(mongrel2_request));
    req->raw_headers = bfromcstr(headers);
    req->body = bfromcstr(body);
    unsigned char response[16];
    mongrel2_ws_handshake_response(req, response);
    if(strncmp((const char*)response,"fQJ,fN/4F4!~K~MH",16) != 0){
        fprintf(stdout,"Response did not match expection\n");
        fprintf(stdout,"Exepcted: fQJ,fN/4F4!~K~MH\n");
        fprintf(stdout,"Got: %s",response);
    }
    mongrel2_request_finalize(req);
    return 0;
}
Exemple #2
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;
}
Exemple #3
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;
}