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; }
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(); }
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; }
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; }
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); }
/* * 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; }
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; }
static mrb_value mrb_http_object_body_get(mrb_state *mrb, mrb_value self) { return OBJECT_GET(mrb, self, "body"); }
static mrb_value mrb_http_object_method_get(mrb_state *mrb, mrb_value self) { return OBJECT_GET(mrb, self, "method"); }
static mrb_value mrb_http_object_headers_get(mrb_state *mrb, mrb_value self) { return OBJECT_GET(mrb, self, "headers"); }
static mrb_value mrb_http_object_fragment_get(mrb_state *mrb, mrb_value self) { return OBJECT_GET(mrb, self, "fragment"); }
static mrb_value mrb_http_object_path_get(mrb_state *mrb, mrb_value self) { return OBJECT_GET(mrb, self, "path"); }
static mrb_value mrb_http_object_schema_get(mrb_state *mrb, mrb_value self) { return OBJECT_GET(mrb, self, "schema"); }
static mrb_value mrb_http_object_content_length_get(mrb_state *mrb, mrb_value self) { return OBJECT_GET(mrb, self, "content_length"); }
static mrb_value mrb_http_object_status_code_get(mrb_state *mrb, mrb_value self) { return OBJECT_GET(mrb, self, "status_code"); }
static mrb_value mrb_http_object_host_get(mrb_state *mrb, mrb_value self) { return OBJECT_GET(mrb, self, "host"); }
hclass_t hobject_class(hobject_t hobj,InvokeTickDeclare){ object_t * obj = OBJECT_GET(hobj); return obj?obj->hclass:NULL; }