VALUE Parser_execute(VALUE self, VALUE data) { ParserWrapper *wrapper = NULL; char *ptr = RSTRING_PTR(data); long len = RSTRING_LEN(data); DATA_GET(self, ParserWrapper, wrapper); wrapper->stopped = Qfalse; size_t nparsed = ryah_http_parser_execute(&wrapper->parser, &settings, ptr, len); if (wrapper->parser.upgrade) { // upgrade request } else if (nparsed != len) { if (!RTEST(wrapper->stopped)) rb_raise(eParserError, "Could not parse data entirely"); else nparsed += 1; // error states fail on the current character } return INT2FIX(nparsed); }
VALUE Parser_execute(VALUE self, VALUE data) { ParserWrapper *wrapper = NULL; Check_Type(data, T_STRING); char *ptr = RSTRING_PTR(data); long len = RSTRING_LEN(data); DATA_GET(self, ParserWrapper, wrapper); wrapper->stopped = Qfalse; size_t nparsed = ryah_http_parser_execute(&wrapper->parser, &settings, ptr, len); if (wrapper->parser.upgrade) { rb_str_cat(wrapper->upgrade_data, ptr + nparsed + 1, len - nparsed - 1); } else if (nparsed != (size_t)len) { if (!RTEST(wrapper->stopped) && !RTEST(wrapper->completed)) rb_raise(eParserError, "Could not parse data entirely"); else nparsed += 1; // error states fail on the current character } return INT2FIX(nparsed); }