class HTTP::Parser

Attributes

default_header_value_type[R]

Public Class Methods

default_header_value_type=(val) click to toggle source
# File lib/http_parser.rb, line 11
def default_header_value_type=(val)
  if (val != :mixed && val != :strings && val != :arrays)
    raise ArgumentError, "Invalid header value type"
  end
  @default_header_value_type = val
end
new(*args) click to toggle source
VALUE Parser_initialize(int argc, VALUE *argv, VALUE self) {
  ParserWrapper *wrapper = NULL;
  DATA_GET(self, ParserWrapper, wrapper);

  VALUE default_header_value_type = Qnil;

  if (argc > 0 && RB_TYPE_P(argv[argc-1], T_HASH)) {
    ID keyword_ids[1];
    keyword_ids[0] = rb_intern("default_header_value_type");
    rb_get_kwargs(argv[argc-1], keyword_ids, 0, 1, &default_header_value_type);
    if (default_header_value_type == Qundef) {
      default_header_value_type = Qnil;
    }
    --argc;
  }

  if (argc == 1) {
    wrapper->callback_object = argv[0];
  }

  if (argc == 2) {
    wrapper->callback_object = argv[0];
    default_header_value_type = argv[1];
  }

  if (default_header_value_type == Qnil) {
    wrapper->header_value_type = rb_iv_get(CLASS_OF(self), "@default_header_value_type");
  } else {
    wrapper->header_value_type = default_header_value_type;
  }

  return self;
}
strict?() click to toggle source
VALUE Parser_strict_p(VALUE klass) {
  return HTTP_PARSER_STRICT == 1 ? Qtrue : Qfalse;
}

Public Instance Methods

<<(p1) click to toggle source
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) {
    if (RTEST(wrapper->stopped) && !RTEST(wrapper->completed))
      nparsed += 1;

    if (nparsed < len)
      rb_str_cat(wrapper->upgrade_data, ptr + nparsed, len - nparsed);
    
  } else if (nparsed != (size_t)len) {
    if (!RTEST(wrapper->stopped) && !RTEST(wrapper->completed))
      rb_raise(eParserError, "Could not parse data entirely (%zu != %zu)", nparsed, len);
    else
      nparsed += 1; // error states fail on the current character
  }

  return INT2FIX(nparsed);
}
header_value_type=(p1) click to toggle source
VALUE Parser_set_header_value_type(VALUE self, VALUE val) {
  if (val != Sarrays && val != Sstrings && val != Smixed) {
    rb_raise(rb_eArgError, "Invalid header value type");
  }

  ParserWrapper *wrapper = NULL;
  DATA_GET(self, ParserWrapper, wrapper);
  wrapper->header_value_type = val;
  return wrapper->header_value_type;
}
http_major() click to toggle source
VALUE Parser_http_major(VALUE self) {
  ParserWrapper *wrapper = NULL;
  DATA_GET(self, ParserWrapper, wrapper);

  if (wrapper->parser.http_major == 0 && wrapper->parser.http_minor == 0)
    return Qnil;
  else
    return INT2FIX(wrapper->parser.http_major);
}
http_method() click to toggle source
VALUE Parser_http_method(VALUE self) {
  ParserWrapper *wrapper = NULL;
  DATA_GET(self, ParserWrapper, wrapper);

  if (wrapper->parser.type == HTTP_REQUEST)
    return rb_str_new2(http_method_str(wrapper->parser.method));
  else
    return Qnil;
}
http_minor() click to toggle source
VALUE Parser_http_minor(VALUE self) {
  ParserWrapper *wrapper = NULL;
  DATA_GET(self, ParserWrapper, wrapper);

  if (wrapper->parser.http_major == 0 && wrapper->parser.http_minor == 0)
    return Qnil;
  else
    return INT2FIX(wrapper->parser.http_minor);
}
http_version() click to toggle source
VALUE Parser_http_version(VALUE self) {
  ParserWrapper *wrapper = NULL;
  DATA_GET(self, ParserWrapper, wrapper);

  if (wrapper->parser.http_major == 0 && wrapper->parser.http_minor == 0)
    return Qnil;
  else
    return rb_ary_new3(2, INT2FIX(wrapper->parser.http_major), INT2FIX(wrapper->parser.http_minor));
}
keep_alive?() click to toggle source
VALUE Parser_keep_alive_p(VALUE self) {
  ParserWrapper *wrapper = NULL;
  DATA_GET(self, ParserWrapper, wrapper);

  return http_should_keep_alive(&wrapper->parser) == 1 ? Qtrue : Qfalse;
}
on_body=(p1) click to toggle source
VALUE Parser_set_on_body(VALUE self, VALUE callback) {
  ParserWrapper *wrapper = NULL;
  DATA_GET(self, ParserWrapper, wrapper);

  wrapper->on_body = callback;
  return callback;
}
on_headers_complete=(p1) click to toggle source
VALUE Parser_set_on_headers_complete(VALUE self, VALUE callback) {
  ParserWrapper *wrapper = NULL;
  DATA_GET(self, ParserWrapper, wrapper);

  wrapper->on_headers_complete = callback;
  return callback;
}
on_message_begin=(p1) click to toggle source
VALUE Parser_set_on_message_begin(VALUE self, VALUE callback) {
  ParserWrapper *wrapper = NULL;
  DATA_GET(self, ParserWrapper, wrapper);

  wrapper->on_message_begin = callback;
  return callback;
}
on_message_complete=(p1) click to toggle source
VALUE Parser_set_on_message_complete(VALUE self, VALUE callback) {
  ParserWrapper *wrapper = NULL;
  DATA_GET(self, ParserWrapper, wrapper);

  wrapper->on_message_complete = callback;
  return callback;
}
reset!() click to toggle source
VALUE Parser_reset(VALUE self) {
  ParserWrapper *wrapper = NULL;
  DATA_GET(self, ParserWrapper, wrapper);

  ParserWrapper_init(wrapper);

  return Qtrue;
}
status_code() click to toggle source
VALUE Parser_status_code(VALUE self) {
  ParserWrapper *wrapper = NULL;
  DATA_GET(self, ParserWrapper, wrapper);

  if (wrapper->parser.status_code)
    return INT2FIX(wrapper->parser.status_code);
  else
    return Qnil;
}
upgrade?() click to toggle source
VALUE Parser_upgrade_p(VALUE self) {
  ParserWrapper *wrapper = NULL;
  DATA_GET(self, ParserWrapper, wrapper);

  return wrapper->parser.upgrade ? Qtrue : Qfalse;
}