void sl_init_ext_gcrypt(sl_vm_t* vm) { SLVAL GCrypt = sl_define_class(vm, "GCrypt", vm->lib.Object); SLVAL Algorithm = sl_define_class3(vm, sl_make_cstring(vm, "Algorithm"), vm->lib.Object, GCrypt); sl_vm_store_put(vm, &cGCrypt, GCrypt); sl_vm_store_put(vm, &cGCrypt_Algorithm, Algorithm); sl_class_set_allocator(vm, Algorithm, allocate_gcrypt_algorithm); sl_define_method(vm, Algorithm, "hex_digest", 1, sl_gcrypt_algorithm_hex_digest); sl_define_method(vm, Algorithm, "to_s", 0, sl_gcrypt_algorithm_inspect); sl_define_method(vm, Algorithm, "inspect", 0, sl_gcrypt_algorithm_inspect); #define MAKE_ALGO(name) make_algorithm_object(vm, GCrypt, Algorithm, #name, GCRY_MD_##name) MAKE_ALGO(MD5); MAKE_ALGO(SHA1); MAKE_ALGO(SHA224); MAKE_ALGO(SHA256); MAKE_ALGO(SHA384); MAKE_ALGO(SHA512); MAKE_ALGO(WHIRLPOOL); }
void sl_response_set_opts(sl_vm_t* vm, sl_response_opts_t* opts) { sl_response_internal_opts_t* iopts = sl_alloc(vm->arena, sizeof(sl_response_internal_opts_t)); iopts->status = 200; iopts->buffered = opts->buffered; iopts->output_cap = 4; iopts->output_len = 0; iopts->output = sl_alloc(vm->arena, sizeof(SLVAL) * iopts->output_cap); iopts->write = opts->write; iopts->header_cap = 2; iopts->header_count = 0; iopts->headers = sl_alloc(vm->arena, sizeof(sl_response_key_value_t) * iopts->header_cap); iopts->descriptive_error_pages = opts->descriptive_error_pages; sl_vm_store_put(vm, &Response_opts, sl_make_ptr((sl_object_t*)iopts)); }
void sl_request_set_opts(sl_vm_t* vm, sl_request_opts_t* opts) { size_t i; SLVAL n, v, cookies; sl_string_t* str; sl_request_internal_opts_t* req = sl_alloc(vm->arena, sizeof(sl_request_internal_opts_t)); req->method = sl_make_cstring(vm, opts->method); req->uri = sl_make_cstring(vm, opts->uri); req->path_info = sl_make_cstring(vm, opts->path_info ? opts->path_info : ""); req->query_string = sl_make_cstring(vm, opts->query_string ? opts->query_string : ""); req->remote_addr = sl_make_cstring(vm, opts->remote_addr); req->headers = sl_make_dict(vm, 0, NULL); req->env = sl_make_dict(vm, 0, NULL); req->get = sl_make_dict(vm, 0, NULL); req->post = sl_make_dict(vm, 0, NULL); req->post_data = sl_make_string(vm, (uint8_t*)opts->post_data, opts->post_length); req->cookies = sl_make_dict(vm, 0, NULL); for(i = 0; i < opts->header_count; i++) { n = sl_make_cstring(vm, opts->headers[i].name); v = sl_make_cstring(vm, opts->headers[i].value); sl_dict_set(vm, req->headers, n, v); } for(i = 0; i < opts->env_count; i++) { n = sl_make_cstring(vm, opts->env[i].name); v = sl_make_cstring(vm, opts->env[i].value); sl_dict_set(vm, req->env, n, v); } if(opts->query_string) { parse_query_string(vm, req->get, strlen(opts->query_string), (uint8_t*)opts->query_string); } if(opts->content_type && strcmp(opts->content_type, "application/x-www-form-urlencoded") == 0) { parse_query_string(vm, req->post, opts->post_length, (uint8_t*)opts->post_data); } cookies = sl_dict_get(vm, req->headers, sl_make_cstring(vm, "Cookie")); if(sl_is_a(vm, cookies, vm->lib.String)) { str = (sl_string_t*)sl_get_ptr(cookies); parse_cookie_string(vm, req->cookies, str->buff_len, str->buff); } req->params = sl_dict_merge(vm, req->get, req->post); sl_vm_store_put(vm, &Request_opts, sl_make_ptr((sl_object_t*)req)); }
void sl_init_request(sl_vm_t* vm) { SLVAL Request = sl_new(vm, vm->lib.Object, 0, NULL); sl_vm_store_put(vm, &Request_, Request); sl_define_singleton_method(vm, Request, "get", 0, request_get); sl_define_singleton_method(vm, Request, "post", 0, request_post); sl_define_singleton_method(vm, Request, "post_data", 0, request_post_data); sl_define_singleton_method(vm, Request, "headers", 0, request_headers); sl_define_singleton_method(vm, Request, "env", 0, request_env); sl_define_singleton_method(vm, Request, "cookies", 0, request_cookies); sl_define_singleton_method(vm, Request, "method", 0, request_method); sl_define_singleton_method(vm, Request, "safe_method", 0, request_safe_method); sl_define_singleton_method(vm, Request, "uri", 0, request_uri); sl_define_singleton_method(vm, Request, "path_info", 0, request_path_info); sl_define_singleton_method(vm, Request, "query_string", 0, request_query_string); sl_define_singleton_method(vm, Request, "remote_addr", 0, request_remote_addr); sl_define_singleton_method(vm, Request, "[]", 1, request_index); sl_class_set_const(vm, vm->lib.Object, "Request", Request); }