···6565 }
6666}
67676868+static const char* get_status_text(int status) {
6969+ switch (status) {
7070+ case 100: return "Continue";
7171+ case 101: return "Switching Protocols";
7272+ case 102: return "Processing";
7373+ case 103: return "Early Hints";
7474+7575+ case 200: return "OK";
7676+ case 201: return "Created";
7777+ case 202: return "Accepted";
7878+ case 203: return "Non-Authoritative Information";
7979+ case 204: return "No Content";
8080+ case 205: return "Reset Content";
8181+ case 206: return "Partial Content";
8282+ case 207: return "Multi-Status";
8383+ case 208: return "Already Reported";
8484+ case 226: return "IM Used";
8585+8686+ case 300: return "Multiple Choices";
8787+ case 301: return "Moved Permanently";
8888+ case 302: return "Found";
8989+ case 303: return "See Other";
9090+ case 304: return "Not Modified";
9191+ case 305: return "Use Proxy";
9292+ case 306: return "Switch Proxy";
9393+ case 307: return "Temporary Redirect";
9494+ case 308: return "Permanent Redirect";
9595+9696+ case 400: return "Bad Request";
9797+ case 401: return "Unauthorized";
9898+ case 402: return "Payment Required";
9999+ case 403: return "Forbidden";
100100+ case 404: return "Not Found";
101101+ case 405: return "Method Not Allowed";
102102+ case 406: return "Not Acceptable";
103103+ case 407: return "Proxy Authentication Required";
104104+ case 408: return "Request Timeout";
105105+ case 409: return "Conflict";
106106+ case 410: return "Gone";
107107+ case 411: return "Length Required";
108108+ case 412: return "Precondition Failed";
109109+ case 413: return "Payload Too Large";
110110+ case 414: return "URI Too Long";
111111+ case 415: return "Unsupported Media Type";
112112+ case 416: return "Range Not Satisfiable";
113113+ case 417: return "Expectation Failed";
114114+ case 418: return "I'm a Teapot";
115115+ case 421: return "Misdirected Request";
116116+ case 422: return "Unprocessable Entity";
117117+ case 423: return "Locked";
118118+ case 424: return "Failed Dependency";
119119+ case 425: return "Too Early";
120120+ case 426: return "Upgrade Required";
121121+ case 428: return "Precondition Required";
122122+ case 429: return "Too Many Requests";
123123+ case 431: return "Request Header Fields Too Large";
124124+ case 451: return "Unavailable For Legal Reasons";
125125+126126+ case 500: return "Internal Server Error";
127127+ case 501: return "Not Implemented";
128128+ case 502: return "Bad Gateway";
129129+ case 503: return "Service Unavailable";
130130+ case 504: return "Gateway Timeout";
131131+ case 505: return "HTTP Version Not Supported";
132132+ case 506: return "Variant Also Negotiates";
133133+ case 507: return "Insufficient Storage";
134134+ case 508: return "Loop Detected";
135135+ case 510: return "Not Extended";
136136+ case 511: return "Network Authentication Required";
137137+138138+ default: return "Unknown";
139139+ }
140140+}
141141+68142typedef struct {
69143 char method[16];
70144 char uri[2048];
···133207134208static void on_close(uv_handle_t *handle);
135209static void send_response(uv_stream_t *client, response_ctx_t *res_ctx);
136136-137137-138210139211static jsval_t res_status(struct js *js, jsval_t *args, int nargs) {
140212 if (nargs < 1) return js_mkundef();
···254326 "Connection: close\r\n"
255327 "\r\n",
256328 res_ctx->status,
257257- res_ctx->status == 200 ? "OK" :
258258- res_ctx->status == 404 ? "Not Found" :
259259- res_ctx->status == 500 ? "Internal Server Error" : "Unknown",
329329+ get_status_text(res_ctx->status),
260330 res_ctx->content_type ? res_ctx->content_type : "text/plain",
261331 res_ctx->body ? strlen(res_ctx->body) : 0
262332 );
···323393 if (js_type(result) == JS_ERR) {
324394 fprintf(stderr, "Handler error: %s\n", js_str(server->js, result));
325395 res_ctx->status = 500;
396396+ // pass error of throw in server into "internal server error" message
326397 res_ctx->body = "internal server error\nant http v" ANT_VERSION " (" ANT_GIT_HASH ")";
327398 res_ctx->content_type = "text/plain";
328399 res_ctx->sent = 1;
+151
tests/test_default_params.cjs
···11+// Test default parameters in function definitions
22+33+// Test 1: Basic default parameter
44+function greet(name = 'World') {
55+ return 'Hello, ' + name;
66+}
77+88+console.log("Test 1 - Basic default param:");
99+console.log(greet()); // Should print "Hello, World"
1010+console.log(greet('Alice')); // Should print "Hello, Alice"
1111+1212+// Test 2: Multiple default parameters
1313+function multiply(a = 1, b = 1, c = 1) {
1414+ return a * b * c;
1515+}
1616+1717+console.log("\nTest 2 - Multiple default params:");
1818+console.log(multiply()); // Should print 1
1919+console.log(multiply(2)); // Should print 2
2020+console.log(multiply(2, 3)); // Should print 6
2121+console.log(multiply(2, 3, 4)); // Should print 24
2222+2323+// Test 3: Mix of regular and default parameters
2424+function describe(name, age = 25, city = 'Unknown') {
2525+ return name + ' is ' + age + ' years old and lives in ' + city;
2626+}
2727+2828+console.log("\nTest 3 - Mix of regular and default params:");
2929+console.log(describe('Alice')); // Should print "Alice is 25 years old and lives in Unknown"
3030+console.log(describe('Bob', 30)); // Should print "Bob is 30 years old and lives in Unknown"
3131+console.log(describe('Charlie', 35, 'NYC')); // Should print "Charlie is 35 years old and lives in NYC"
3232+3333+// Test 4: Default parameter with number
3434+function power(base = 2, exponent = 2) {
3535+ let result = 1;
3636+ for (let i = 0; i < exponent; i++) {
3737+ result = result * base;
3838+ }
3939+ return result;
4040+}
4141+4242+console.log("\nTest 4 - Default params with numbers:");
4343+console.log(power()); // Should print 4 (2^2)
4444+console.log(power(3)); // Should print 9 (3^2)
4545+console.log(power(2, 3)); // Should print 8 (2^3)
4646+4747+// Test 5: Arrow function with default parameters
4848+const add = (a = 0, b = 0) => a + b;
4949+5050+console.log("\nTest 5 - Arrow function with default params:");
5151+console.log(add()); // Should print 0
5252+console.log(add(5)); // Should print 5
5353+console.log(add(5, 3)); // Should print 8
5454+5555+// Test 6: Class methods with default parameters
5656+class Calculator {
5757+ add(x = 0, y = 0) {
5858+ return x + y;
5959+ }
6060+6161+ subtract(x = 0, y = 0) {
6262+ return x - y;
6363+ }
6464+6565+ multiply(x = 1, y = 1) {
6666+ return x * y;
6767+ }
6868+}
6969+7070+console.log("\nTest 6 - Class methods with default params:");
7171+const calc = new Calculator();
7272+console.log(calc.add()); // Should print 0
7373+console.log(calc.add(10)); // Should print 10
7474+console.log(calc.add(10, 5)); // Should print 15
7575+console.log(calc.multiply()); // Should print 1
7676+console.log(calc.multiply(3)); // Should print 3
7777+console.log(calc.multiply(3, 4)); // Should print 12
7878+7979+// Test 7: Default params with special characters in strings
8080+function wrap(text, left = '(', right = ')') {
8181+ return left + text + right;
8282+}
8383+8484+console.log("\nTest 7 - Default params with parens in strings:");
8585+console.log(wrap('hello')); // Should print "(hello)"
8686+console.log(wrap('hello', '<', '>')); // Should print "<hello>"
8787+console.log(wrap('hello', '[')); // Should print "[hello)"
8888+8989+// Test 8: Default with undefined explicitly passed
9090+function testUndefined(a = 'default') {
9191+ return a;
9292+}
9393+9494+console.log("\nTest 8 - Explicit undefined uses default:");
9595+console.log(testUndefined()); // Should print "default"
9696+console.log(testUndefined(undefined)); // Should print "default"
9797+console.log(testUndefined('value')); // Should print "value"
9898+9999+// Test 9: Complex default expressions
100100+function createArray(size = 5, fill = 'x') {
101101+ let arr = [];
102102+ for (let i = 0; i < size; i++) {
103103+ arr.push(fill);
104104+ }
105105+ return arr;
106106+}
107107+108108+console.log("\nTest 9 - Default params with expressions:");
109109+console.log(createArray().length); // Should print 5
110110+console.log(createArray(3).length); // Should print 3
111111+console.log(createArray(2, 'o').join('')); // Should print "oo"
112112+113113+// Test 10: Async function with default parameters
114114+async function asyncGreet(name = 'Async World') {
115115+ return 'Hello, ' + name;
116116+}
117117+118118+console.log("\nTest 10 - Async function with default params:");
119119+asyncGreet().then(result => console.log(result)); // Should print "Hello, Async World"
120120+asyncGreet('Async Alice').then(result => console.log(result)); // Should print "Hello, Async Alice"
121121+122122+// Test 11: Default parameters in constructor
123123+class Person {
124124+ constructor(name = 'Anonymous', age = 0) {
125125+ this.name = name;
126126+ this.age = age;
127127+ }
128128+129129+ introduce() {
130130+ return this.name + ' is ' + this.age;
131131+ }
132132+}
133133+134134+console.log("\nTest 11 - Constructor with default params:");
135135+const p1 = new Person();
136136+console.log(p1.introduce()); // Should print "Anonymous is 0"
137137+const p2 = new Person('Dave');
138138+console.log(p2.introduce()); // Should print "Dave is 0"
139139+const p3 = new Person('Eve', 28);
140140+console.log(p3.introduce()); // Should print "Eve is 28"
141141+142142+// Test 12: Only last parameters have defaults
143143+function compute(required, optional = 10) {
144144+ return required + optional;
145145+}
146146+147147+console.log("\nTest 12 - Required param then default:");
148148+console.log(compute(5)); // Should print 15
149149+console.log(compute(5, 20)); // Should print 25
150150+151151+console.log("\nโ All default parameter tests completed!");
+20
tests/test_three_params.js
···11+// Test method with 3 parameters where last 2 have defaults
22+class Formatter {
33+ wrap(text, left = '(', right = ')') {
44+ console.log('wrap called with:', text, left, right);
55+ return left + text + right;
66+ }
77+}
88+99+console.log("Test 1 - All 3 params provided:");
1010+const fmt = new Formatter();
1111+const result1 = fmt.wrap('test', '<', '>');
1212+console.log('Result:', result1);
1313+1414+console.log("\nTest 2 - Only first param (2 defaults):");
1515+const result2 = fmt.wrap('test');
1616+console.log('Result:', result2);
1717+1818+console.log("\nTest 3 - First 2 params (1 default):");
1919+const result3 = fmt.wrap('test', '[');
2020+console.log('Result:', result3);