Exemple #1
0
static int
parser_settings_on_headers_complete(http_parser* parser)
{
  mrb_http_parser_context *context = (mrb_http_parser_context*) parser->data;
  mrb_state* mrb = context->mrb;

  int ai = mrb_gc_arena_save(mrb);
  if(!mrb_nil_p(OBJECT_GET(mrb, context->instance, "last_header_field"))) {
    mrb_hash_set(mrb, OBJECT_GET(mrb, context->instance, "headers"),
        OBJECT_GET(mrb, context->instance, "last_header_field"),
        OBJECT_GET(mrb, context->instance, "last_header_value"));
  }
  mrb_gc_arena_restore(mrb, ai);
  return 0;
}
Exemple #2
0
static mrb_value
mrb_http_object_headers_set_item(mrb_state *mrb, mrb_value self)
{
  mrb_value key, value;
  mrb_get_args(mrb, "SS", &key, &value);
  mrb_hash_set(mrb, OBJECT_GET(mrb, self, "headers"), key, value);
  return mrb_nil_value();
}
Exemple #3
0
static int
parser_settings_on_header_value(http_parser* parser, const char* at, size_t len)
{
  mrb_http_parser_context *context = (mrb_http_parser_context*) parser->data;
  mrb_state* mrb = context->mrb;

  int ai = mrb_gc_arena_save(mrb);
  if(!context->was_header_value) {
    OBJECT_SET(mrb, context->instance, "last_header_value", mrb_str_new(mrb, at, len));
    context->was_header_value = TRUE;
    mrb_hash_set(mrb, OBJECT_GET(mrb, context->instance, "headers"),
        OBJECT_GET(mrb, context->instance, "last_header_field"),
        OBJECT_GET(mrb, context->instance, "last_header_value"));
  } else {
    mrb_str_concat(mrb, OBJECT_GET(mrb, context->instance, "last_header_value"), mrb_str_new(mrb, at, len));
  }
  mrb_gc_arena_restore(mrb, ai);
  return 0;
}
Exemple #4
0
hany hobject_ptr_by_class(hobject_t hobj,hclass_t hclass,InvokeTickDeclare){
	object_t * obj = OBJECT_GET(hobj);
	if(obj && hclass){
		hint32 size = hclass_size(hclass,InvokeTickArg);
		hint32 total_size = hclass_total_size(hclass,InvokeTickArg);
		if(size >0){
			return (hbyte *)obj + sizeof(object_t) + total_size - size;
		}
	}
	return NULL;
}
Exemple #5
0
static mrb_value
mrb_http_object_message_get(mrb_state *mrb, mrb_value self)
{
  const char* message = NULL;
  switch(mrb_fixnum(OBJECT_GET(mrb, self, "status_code"))) {
    case 100: message = "Continue"; break;
    case 101: message = "Switching Protocols"; break;
    case 200: message = "OK"; break;
    case 201: message = "Created"; break;
    case 202: message = "Accepted"; break;
    case 203: message = "Non-Authoritative Information"; break;
    case 204: message = "No Content"; break;
    case 205: message = "Reset Content"; break;
    case 206: message = "Partial Content"; break;
    case 300: message = "Multiple Choices"; break;
    case 301: message = "Moved Permanently"; break;
    case 302: message = "Found"; break;
    case 303: message = "See Other"; break;
    case 304: message = "Not Modified"; break;
    case 305: message = "Use Proxy"; break;
              //case 306: message = "(reserved)"; break;
    case 307: message = "Temporary Redirect"; break;
    case 400: message = "Bad Request"; break;
    case 401: message = "Unauthorized"; break;
    case 402: message = "Payment Required"; break;
    case 403: message = "Forbidden"; break;
    case 404: message = "Not Found"; break;
    case 405: message = "Method Not Allowed"; break;
    case 406: message = "Not Acceptable"; break;
    case 407: message = "Proxy Authentication Required"; break;
    case 408: message = "Request Timeout"; break;
    case 409: message = "Conflict"; break;
    case 410: message = "Gone"; break;
    case 411: message = "Length Required"; break;
    case 412: message = "Precondition Failed"; break;
    case 413: message = "Request Entity Too Large"; break;
    case 414: message = "Request-URI Too Long"; break;
    case 415: message = "Unsupported Media Type"; break;
    case 416: message = "Requested Range Not Satisfiable"; break;
    case 417: message = "Expectation Failed"; break;
    case 500: message = "Internal Server Error"; break;
    case 501: message = "Not Implemented"; break;
    case 502: message = "Bad Gateway"; break;
    case 503: message = "Service Unavailable"; break;
    case 504: message = "Gateway Timeout"; break;
    case 505: message = "HTTP Version Not Supported"; break;
    default: mrb_raise(mrb, E_RUNTIME_ERROR, "Not supported status code.");
  }
  return mrb_str_new_cstr(mrb, message);
}
Exemple #6
0
/*
 * Search file in current runtime path, translate it and
 * execute bytecode by current runtime. Return boolean
 * indicating if translation was sucessful.
 * */
int32_t Yoyo_interpret_file(ILBytecode* bc, YRuntime* runtime, wchar_t* wpath) {
	Environment* env = runtime->env;
	FILE* file = env->getFile(env, wpath);
	if (file == NULL) {
		yerror(ErrorFileNotFound, wpath, yoyo_thread(runtime));
		return false;
	} else {
		YThread* th = yoyo_thread(runtime);
		CompilationResult res = yoyoc((YoyoCEnvironment*) env,
			file_input_stream(env->getFile(env, wpath)), wpath);
		if (res.pid != -1) {
			invoke(res.pid, bc, runtime->global_scope, NULL, th);
//			ILProcedure* proc = bc->procedures[res.pid];
//			proc->free(proc, bc);
			if (th->exception != NULL) {
				YValue* e = th->exception;
				th->exception = NULL;
				wchar_t* wstr = toString(e, th);
				fprintf(th->runtime->env->out_stream, "%ls\n", wstr);
				if (e->type == &th->runtime->ObjectType) {
					YObject* obj = (YObject*) e;
					if (OBJECT_HAS(obj, L"trace", th)) {
						YValue* trace = OBJECT_GET(obj, L"trace", th);
						wchar_t* wcs = toString(trace, th);
						fprintf(runtime->env->out_stream, "%ls\n", wcs);
						free(wcs);
					}
				}
				free(wstr);
				return -1;
			}
			return res.pid;
		}
		fprintf(runtime->env->out_stream, "%ls\n", res.log);
		free(res.log);
	}
	return -1;
}
Exemple #7
0
static int
parser_settings_on_message_complete(http_parser* parser)
{
    mrb_http_parser_context *context = (mrb_http_parser_context*) parser->data;
    mrb_state* mrb = context->mrb;
    mrb_value c = context->instance;

    if (context->handle.field_set & (1<<UF_SCHEMA)) {
        OBJECT_SET(mrb, c, "schema", mrb_str_substr(mrb, OBJECT_GET(mrb, c, "buf"), context->handle.field_data[UF_SCHEMA].off, context->handle.field_data[UF_SCHEMA].len));
    }
    if (context->handle.field_set & (1<<UF_HOST)) {
        OBJECT_SET(mrb, c, "host", mrb_str_substr(mrb, OBJECT_GET(mrb, c, "buf"), context->handle.field_data[UF_HOST].off, context->handle.field_data[UF_HOST].len));
    }
    if (context->handle.field_set & (1<<UF_HOST)) {
        OBJECT_SET(mrb, c, "host", mrb_str_substr(mrb, OBJECT_GET(mrb, c, "buf"), context->handle.field_data[UF_HOST].off, context->handle.field_data[UF_HOST].len));
    }
    if (context->handle.field_set & (1<<UF_PORT)) {
        OBJECT_SET(mrb, c, "port", mrb_fixnum_value(context->handle.port));
    } else {
        if (context->handle.field_set & (1<<UF_SCHEMA)) {
            mrb_value schema = mrb_str_substr(mrb, OBJECT_GET(mrb, c, "buf"), context->handle.field_data[UF_SCHEMA].off, context->handle.field_data[UF_SCHEMA].len);
            if (!mrb_nil_p(schema) && !strcmp("https", (char*) RSTRING_PTR(schema))) {
                OBJECT_SET(mrb, c, "port", mrb_fixnum_value(443));
            }
        }
    }
    if (context->handle.field_set & (1<<UF_PATH)) {
        OBJECT_SET(mrb, c, "path", mrb_str_substr(mrb, OBJECT_GET(mrb, c, "buf"), context->handle.field_data[UF_PATH].off, context->handle.field_data[UF_PATH].len));
    }
    if (context->handle.field_set & (1<<UF_QUERY)) {
        OBJECT_SET(mrb, c, "query", mrb_str_substr(mrb, OBJECT_GET(mrb, c, "buf"), context->handle.field_data[UF_QUERY].off, context->handle.field_data[UF_QUERY].len));
    }
    if (context->parser.method)
        OBJECT_SET(mrb, c, "method", mrb_str_new_cstr(mrb, http_method_str(context->parser.method)));
    if (context->parser.status_code)
        OBJECT_SET(mrb, c, "status_code", mrb_fixnum_value(context->parser.status_code));
    if (context->parser.content_length)
        OBJECT_SET(mrb, c, "content_length", mrb_fixnum_value(context->parser.content_length));
    OBJECT_REMOVE(mrb, c, "last_header_field");
    OBJECT_REMOVE(mrb, c, "last_header_value");
    OBJECT_REMOVE(mrb, c, "buf");

    return 0;
}
Exemple #8
0
static mrb_value
mrb_http_object_body_get(mrb_state *mrb, mrb_value self)
{
  return OBJECT_GET(mrb, self, "body");
}
Exemple #9
0
static mrb_value
mrb_http_object_method_get(mrb_state *mrb, mrb_value self)
{
  return OBJECT_GET(mrb, self, "method");
}
Exemple #10
0
static mrb_value
mrb_http_object_headers_get(mrb_state *mrb, mrb_value self)
{
  return OBJECT_GET(mrb, self, "headers");
}
Exemple #11
0
static mrb_value
mrb_http_object_fragment_get(mrb_state *mrb, mrb_value self)
{
  return OBJECT_GET(mrb, self, "fragment");
}
Exemple #12
0
static mrb_value
mrb_http_object_path_get(mrb_state *mrb, mrb_value self)
{
  return OBJECT_GET(mrb, self, "path");
}
Exemple #13
0
static mrb_value
mrb_http_object_schema_get(mrb_state *mrb, mrb_value self)
{
  return OBJECT_GET(mrb, self, "schema");
}
Exemple #14
0
static mrb_value
mrb_http_object_content_length_get(mrb_state *mrb, mrb_value self)
{
  return OBJECT_GET(mrb, self, "content_length");
}
Exemple #15
0
static mrb_value
mrb_http_object_status_code_get(mrb_state *mrb, mrb_value self)
{
  return OBJECT_GET(mrb, self, "status_code");
}
Exemple #16
0
static mrb_value
mrb_http_object_host_get(mrb_state *mrb, mrb_value self)
{
  return OBJECT_GET(mrb, self, "host");
}
Exemple #17
0
hclass_t hobject_class(hobject_t hobj,InvokeTickDeclare){
	object_t * obj = OBJECT_GET(hobj);
	return obj?obj->hclass:NULL;
}