diff --git a/README.md b/README.md index d34fbe1..a62195f 100644 --- a/README.md +++ b/README.md @@ -50,7 +50,7 @@ private static void ServerCommandReceived(object source, WebServerEventArgs e) { if (e.Context.Request.RawUrl.ToLower() == "/hello") { - WebServer.OutPutStream(e.Context.Response, "Hello from nanoFramework!"); + WebServer.OutputAsStream(e.Context.Response, "Hello from nanoFramework!"); } else { @@ -76,7 +76,7 @@ public class MyController [Method("GET")] public void Hello(WebServerEventArgs e) { - WebServer.OutPutStream(e.Context.Response, "Hello from Controller!"); + WebServer.OutputAsStream(e.Context.Response, "Hello from Controller!"); } [Route("api/led/{id}")] @@ -84,7 +84,7 @@ public class MyController public void LedState(WebServerEventArgs e) { string ledId = e.GetRouteParameter("id"); - WebServer.OutPutStream(e.Context.Response, $"You selected Led {ledId}!"); + WebServer.OutputAsStream(e.Context.Response, $"You selected Led {ledId}!"); } } ``` diff --git a/doc/authentication.md b/doc/authentication.md index 48b920e..8427f81 100644 --- a/doc/authentication.md +++ b/doc/authentication.md @@ -23,7 +23,7 @@ public class SecureController [Route("secure/data")] public void GetSecureData(WebServerEventArgs e) { - WebServer.OutPutStream(e.Context.Response, "Secure data"); + WebServer.OutputAsStream(e.Context.Response, "Secure data"); } } @@ -45,14 +45,14 @@ public class UserController [Authentication("Basic:admin secretpassword")] public void AdminPanel(WebServerEventArgs e) { - WebServer.OutPutStream(e.Context.Response, "Admin panel"); + WebServer.OutputAsStream(e.Context.Response, "Admin panel"); } [Route("user")] [Authentication("Basic:user userpass")] public void UserPanel(WebServerEventArgs e) { - WebServer.OutPutStream(e.Context.Response, "User panel"); + WebServer.OutputAsStream(e.Context.Response, "User panel"); } } ``` @@ -70,7 +70,7 @@ public class ApiController [Route("api/data")] public void GetData(WebServerEventArgs e) { - WebServer.OutPutStream(e.Context.Response, "API data"); + WebServer.OutputAsStream(e.Context.Response, "API data"); } } @@ -92,14 +92,14 @@ public class ServiceController [Authentication("ApiKey:premium-key-789")] public void PremiumService(WebServerEventArgs e) { - WebServer.OutPutStream(e.Context.Response, "Premium service"); + WebServer.OutputAsStream(e.Context.Response, "Premium service"); } [Route("service/basic")] [Authentication("ApiKey:basic-key-456")] public void BasicService(WebServerEventArgs e) { - WebServer.OutPutStream(e.Context.Response, "Basic service"); + WebServer.OutputAsStream(e.Context.Response, "Basic service"); } } ``` @@ -125,7 +125,7 @@ public class PublicController [Route("public/info")] public void GetPublicInfo(WebServerEventArgs e) { - WebServer.OutPutStream(e.Context.Response, "Public information"); + WebServer.OutputAsStream(e.Context.Response, "Public information"); } } ``` @@ -140,28 +140,28 @@ public class MixedController public void BasicAuth(WebServerEventArgs e) { // Uses class-level Basic authentication - WebServer.OutPutStream(e.Context.Response, "Basic auth data"); + WebServer.OutputAsStream(e.Context.Response, "Basic auth data"); } [Route("secure/api")] [Authentication("ApiKey:special-key-123")] // Override with API key public void ApiKeyAuth(WebServerEventArgs e) { - WebServer.OutPutStream(e.Context.Response, "API key data"); + WebServer.OutputAsStream(e.Context.Response, "API key data"); } [Route("secure/custom")] [Authentication("Basic:customuser custompass")] // Override with custom basic auth public void CustomAuth(WebServerEventArgs e) { - WebServer.OutPutStream(e.Context.Response, "Custom auth data"); + WebServer.OutputAsStream(e.Context.Response, "Custom auth data"); } [Route("public")] [Authentication("None")] // Override to allow public access public void PublicAccess(WebServerEventArgs e) { - WebServer.OutPutStream(e.Context.Response, "Public data"); + WebServer.OutputAsStream(e.Context.Response, "Public data"); } } ``` @@ -177,27 +177,27 @@ public class MultiAuthController [Authentication("Basic")] public void DataBasicAuth(WebServerEventArgs e) { - WebServer.OutPutStream(e.Context.Response, "Data via Basic auth"); + WebServer.OutputAsStream(e.Context.Response, "Data via Basic auth"); } [Route("data")] [Authentication("ApiKey:key1")] public void DataApiKey1(WebServerEventArgs e) { - WebServer.OutPutStream(e.Context.Response, "Data via API key 1"); + WebServer.OutputAsStream(e.Context.Response, "Data via API key 1"); } [Route("data")] [Authentication("ApiKey:key2")] public void DataApiKey2(WebServerEventArgs e) { - WebServer.OutPutStream(e.Context.Response, "Data via API key 2"); + WebServer.OutputAsStream(e.Context.Response, "Data via API key 2"); } [Route("data")] public void DataPublic(WebServerEventArgs e) { - WebServer.OutPutStream(e.Context.Response, "Public data"); + WebServer.OutputAsStream(e.Context.Response, "Public data"); } } ``` diff --git a/doc/controllers-routing.md b/doc/controllers-routing.md index a85f905..a65fd4a 100644 --- a/doc/controllers-routing.md +++ b/doc/controllers-routing.md @@ -31,7 +31,7 @@ public class TestController [Method("GET")] public void GetTest(WebServerEventArgs e) { - WebServer.OutPutStream(e.Context.Response, "Test endpoint"); + WebServer.OutputAsStream(e.Context.Response, "Test endpoint"); } } ``` @@ -47,7 +47,7 @@ public class TestController public void MultipleRoutes(WebServerEventArgs e) { string route = e.Context.Request.RawUrl.TrimStart('/').Split('/')[0]; - WebServer.OutPutStream(e.Context.Response, $"Route: {route}"); + WebServer.OutputAsStream(e.Context.Response, $"Route: {route}"); } } ``` @@ -123,7 +123,7 @@ public class TestController { // Will handle GET, POST, PUT, DELETE, etc. string method = e.Context.Request.HttpMethod; - WebServer.OutPutStream(e.Context.Response, $"Method: {method}"); + WebServer.OutputAsStream(e.Context.Response, $"Method: {method}"); } } ``` @@ -162,7 +162,7 @@ public void GetUser(WebServerEventArgs e) if (segments.Length > 2) { string userId = segments[2]; // /api/users/123 - WebServer.OutPutStream(e.Context.Response, $"User ID: {userId}"); + WebServer.OutputAsStream(e.Context.Response, $"User ID: {userId}"); } } ``` @@ -176,7 +176,7 @@ nanoFramework WebServer supports parameterized routes with named placeholders us public void GetUserById(WebServerEventArgs e) { string userId = e.GetRouteParameter("id"); - WebServer.OutPutStream(e.Context.Response, $"User ID: {userId}"); + WebServer.OutputAsStream(e.Context.Response, $"User ID: {userId}"); } [Route("api/users/{userId}/sensors/{sensorId}")] @@ -185,7 +185,7 @@ public void GetUserSensor(WebServerEventArgs e) string userId = e.GetRouteParameter("userId"); string sensorId = e.GetRouteParameter("sensorId"); - WebServer.OutPutStream(e.Context.Response, + WebServer.OutputAsStream(e.Context.Response, $"User: {userId}, Sensor: {sensorId}"); } @@ -196,7 +196,7 @@ public void GetDeviceMeasurement(WebServerEventArgs e) string measurementType = e.GetRouteParameter("type"); // Example: /api/devices/esp32-001/measurements/temperature - WebServer.OutPutStream(e.Context.Response, + WebServer.OutputAsStream(e.Context.Response, $"Device {deviceId} - {measurementType} data"); } ``` @@ -223,7 +223,7 @@ public class PersonController { string json = JsonConvert.SerializeObject(persons); e.Context.Response.ContentType = "application/json"; - WebServer.OutPutStream(e.Context.Response, json); + WebServer.OutputAsStream(e.Context.Response, json); } [Route("api/persons/{id}")] @@ -238,7 +238,7 @@ public class PersonController { string json = JsonConvert.SerializeObject(person); e.Context.Response.ContentType = "application/json"; - WebServer.OutPutStream(e.Context.Response, json); + WebServer.OutputAsStream(e.Context.Response, json); } else { @@ -421,7 +421,7 @@ public void GetData(WebServerEventArgs e) string json = JsonConvert.SerializeObject(data); e.Context.Response.ContentType = "application/json"; - WebServer.OutPutStream(e.Context.Response, json); + WebServer.OutputAsStream(e.Context.Response, json); } ``` @@ -433,7 +433,7 @@ public void GetPage(WebServerEventArgs e) { string html = "

Hello nanoFramework!

"; e.Context.Response.ContentType = "text/html"; - WebServer.OutPutStream(e.Context.Response, html); + WebServer.OutputAsStream(e.Context.Response, html); } ``` @@ -446,6 +446,6 @@ Bonus point if you read up to here, you can also create your custom status code! public void CustomStatus(WebServerEventArgs e) { e.Context.Response.StatusCode = 418; // I'm a teapot - WebServer.OutPutStream(e.Context.Response, "I'm a teapot!"); + WebServer.OutputAsStream(e.Context.Response, "I'm a teapot!"); } ``` diff --git a/doc/event-driven.md b/doc/event-driven.md index 792d9d4..09c8be4 100644 --- a/doc/event-driven.md +++ b/doc/event-driven.md @@ -66,7 +66,7 @@ private static void ServerCommandReceived(object source, WebServerEventArgs e) if (url.ToLower() == "/hello") { - WebServer.OutPutStream(e.Context.Response, "Hello from nanoFramework!"); + WebServer.OutputAsStream(e.Context.Response, "Hello from nanoFramework!"); } else { @@ -101,7 +101,7 @@ private static void ServerCommandReceived(object source, WebServerEventArgs e) } response += ""; - WebServer.OutPutStream(e.Context.Response, response); + WebServer.OutputAsStream(e.Context.Response, response); } } ``` @@ -135,7 +135,7 @@ private static void ServerCommandReceived(object source, WebServerEventArgs e) { // Create a test file File.WriteAllText("I:\\test.txt", "This is a dynamically created file"); - WebServer.OutPutStream(e.Context.Response, "File created successfully"); + WebServer.OutputAsStream(e.Context.Response, "File created successfully"); } } ``` @@ -262,7 +262,7 @@ private static void ServerCommandReceived(object source, WebServerEventArgs e) } // Send response - WebServer.OutPutStream(response, "Request processed successfully"); + WebServer.OutputAsStream(response, "Request processed successfully"); } ``` @@ -280,16 +280,16 @@ private static void ServerCommandReceived(object source, WebServerEventArgs e) switch (url.ToLower()) { case "/": - WebServer.OutPutStream(e.Context.Response, "Welcome to nanoFramework WebServer!"); + WebServer.OutputAsStream(e.Context.Response, "Welcome to nanoFramework WebServer!"); break; case "/time": - WebServer.OutPutStream(e.Context.Response, $"Current time: {DateTime.UtcNow}"); + WebServer.OutputAsStream(e.Context.Response, $"Current time: {DateTime.UtcNow}"); break; case "/info": var info = $"Server running on nanoFramework\nUptime: {Environment.TickCount}ms"; - WebServer.OutPutStream(e.Context.Response, info); + WebServer.OutputAsStream(e.Context.Response, info); break; default: @@ -325,7 +325,7 @@ private static void ServerCommandReceived(object source, WebServerEventArgs e) "; - WebServer.OutPutStream(e.Context.Response, html); + WebServer.OutputAsStream(e.Context.Response, html); } } ``` @@ -350,7 +350,7 @@ private static void ServerCommandReceived(object source, WebServerEventArgs e) ""memory"": {System.GC.GetTotalMemory(false)} }}"; - WebServer.OutPutStream(e.Context.Response, json); + WebServer.OutputAsStream(e.Context.Response, json); } else { @@ -411,12 +411,12 @@ private static void HandleRequest(WebServerEventArgs e) { response += $"{entry}\n"; } - WebServer.OutPutStream(e.Context.Response, response); + WebServer.OutputAsStream(e.Context.Response, response); } else { // Handle other requests - WebServer.OutPutStream(e.Context.Response, "Request processed"); + WebServer.OutputAsStream(e.Context.Response, "Request processed"); } } ``` @@ -503,7 +503,7 @@ private static void HandleJsonRequest(WebServerEventArgs e) // Process JSON and respond e.Context.Response.ContentType = "application/json"; - WebServer.OutPutStream(e.Context.Response, "{\"status\":\"success\"}"); + WebServer.OutputAsStream(e.Context.Response, "{\"status\":\"success\"}"); } ``` @@ -561,7 +561,7 @@ private static void ServerCommandReceived(object source, WebServerEventArgs e) }).Start(); // Return immediate response - WebServer.OutPutStream(e.Context.Response, "Processing started"); + WebServer.OutputAsStream(e.Context.Response, "Processing started"); } // Here, you would implement another routing for returning the status of your long process. } @@ -649,7 +649,7 @@ private static void ServerCommandReceived(object source, WebServerEventArgs e) System.GC.Collect(); response.StatusCode = (int)HttpStatusCode.ServiceUnavailable; - WebServer.OutPutStream(response, "Service temporarily unavailable - low memory"); + WebServer.OutputAsStream(response, "Service temporarily unavailable - low memory"); } catch (System.IO.IOException ioEx) { @@ -717,7 +717,7 @@ private static void ServerCommandReceived(object source, WebServerEventArgs e) ResponseBuilder.Append("Response data: "); ResponseBuilder.Append(DateTime.UtcNow); - WebServer.OutPutStream(e.Context.Response, ResponseBuilder.ToString()); + WebServer.OutputAsStream(e.Context.Response, ResponseBuilder.ToString()); } ``` @@ -734,7 +734,7 @@ private static void ServerCommandReceived(object source, WebServerEventArgs e) if (ResponseCache.Contains(url)) { string cachedResponse = (string)ResponseCache[url]; - WebServer.OutPutStream(e.Context.Response, cachedResponse); + WebServer.OutputAsStream(e.Context.Response, cachedResponse); return; } @@ -747,7 +747,7 @@ private static void ServerCommandReceived(object source, WebServerEventArgs e) ResponseCache[url] = response; } - WebServer.OutPutStream(e.Context.Response, response); + WebServer.OutputAsStream(e.Context.Response, response); } ``` diff --git a/doc/https-certificates.md b/doc/https-certificates.md index 36e03b8..72ce8fb 100644 --- a/doc/https-certificates.md +++ b/doc/https-certificates.md @@ -88,7 +88,7 @@ public class SecureController string json = JsonConvert.SerializeObject(data); e.Context.Response.ContentType = "application/json"; - WebServer.OutPutStream(e.Context.Response, json); + WebServer.OutputAsStream(e.Context.Response, json); } } diff --git a/doc/rest-api.md b/doc/rest-api.md index 2044daa..cd5a108 100644 --- a/doc/rest-api.md +++ b/doc/rest-api.md @@ -53,7 +53,7 @@ public class ApiController }; e.Context.Response.ContentType = "application/json"; - WebServer.OutPutStream(e.Context.Response, JsonConvert.SerializeObject(response)); + WebServer.OutputAsStream(e.Context.Response, JsonConvert.SerializeObject(response)); } [Route("api/hello")] @@ -67,7 +67,7 @@ public class ApiController var response = $"{{\"message\":\"Hello, {content}!\"}}"; e.Context.Response.ContentType = "application/json"; - WebServer.OutPutStream(e.Context.Response, response); + WebServer.OutputAsStream(e.Context.Response, response); } else { @@ -215,7 +215,7 @@ public class DeviceController }; e.Context.Response.ContentType = "application/json"; - WebServer.OutPutStream(e.Context.Response, JsonConvert.SerializeObject(deviceInfo)); + WebServer.OutputAsStream(e.Context.Response, JsonConvert.SerializeObject(deviceInfo)); } [Route("api/sensors")] @@ -230,7 +230,7 @@ public class DeviceController }; e.Context.Response.ContentType = "application/json"; - WebServer.OutPutStream(e.Context.Response, JsonConvert.SerializeObject(sensors)); + WebServer.OutputAsStream(e.Context.Response, JsonConvert.SerializeObject(sensors)); } private static DateTime _startTime = DateTime.UtcNow; @@ -277,7 +277,7 @@ public class ConfigController var error = $"{{\"error\":\"Request body is required\"}}"; e.Context.Response.ContentType = "application/json"; e.Context.Response.StatusCode = (int)HttpStatusCode.BadRequest; - WebServer.OutPutStream(e.Context.Response, error); + WebServer.OutputAsStream(e.Context.Response, error); return; } @@ -291,7 +291,7 @@ public class ConfigController var error = $"{{\"error\":\"Missing required fields: name, value\"}}"; e.Context.Response.ContentType = "application/json"; e.Context.Response.StatusCode = (int)HttpStatusCode.BadRequest; - WebServer.OutPutStream(e.Context.Response, error); + WebServer.OutputAsStream(e.Context.Response, error); return; } @@ -307,14 +307,14 @@ public class ConfigController e.Context.Response.ContentType = "application/json"; e.Context.Response.StatusCode = (int)HttpStatusCode.Created; - WebServer.OutPutStream(e.Context.Response, JsonConvert.SerializeObject(response)); + WebServer.OutputAsStream(e.Context.Response, JsonConvert.SerializeObject(response)); } catch (Exception ex) { var error = $"{{\"error\":\"Internal server error: {ex.Message}\"}}"; e.Context.Response.ContentType = "application/json"; e.Context.Response.StatusCode = (int)HttpStatusCode.InternalServerError; - WebServer.OutPutStream(e.Context.Response, error); + WebServer.OutputAsStream(e.Context.Response, error); } } @@ -351,7 +351,7 @@ public class LedController var error = $"{{\"error\":\"Missing 'state' field\"}}"; e.Context.Response.ContentType = "application/json"; e.Context.Response.StatusCode = (int)HttpStatusCode.BadRequest; - WebServer.OutPutStream(e.Context.Response, error); + WebServer.OutputAsStream(e.Context.Response, error); return; } @@ -364,7 +364,7 @@ public class LedController var error = $"{{\"error\":\"State must be 'on' or 'off'\"}}"; e.Context.Response.ContentType = "application/json"; e.Context.Response.StatusCode = (int)HttpStatusCode.BadRequest; - WebServer.OutPutStream(e.Context.Response, error); + WebServer.OutputAsStream(e.Context.Response, error); return; } @@ -380,14 +380,14 @@ public class LedController }; e.Context.Response.ContentType = "application/json"; - WebServer.OutPutStream(e.Context.Response, JsonConvert.SerializeObject(response)); + WebServer.OutputAsStream(e.Context.Response, JsonConvert.SerializeObject(response)); } catch (Exception ex) { var error = $"{{\"error\":\"Failed to update LED: {ex.Message}\"}}"; e.Context.Response.ContentType = "application/json"; e.Context.Response.StatusCode = (int)HttpStatusCode.InternalServerError; - WebServer.OutPutStream(e.Context.Response, error); + WebServer.OutputAsStream(e.Context.Response, error); } } @@ -428,7 +428,7 @@ public class DataController }; e.Context.Response.ContentType = "application/json"; - WebServer.OutPutStream(e.Context.Response, JsonConvert.SerializeObject(response)); + WebServer.OutputAsStream(e.Context.Response, JsonConvert.SerializeObject(response)); } // Delete specific item by ID using parameterized route @@ -450,14 +450,14 @@ public class DataController }; e.Context.Response.ContentType = "application/json"; - WebServer.OutPutStream(e.Context.Response, response); + WebServer.OutputAsStream(e.Context.Response, response); } else { var error = $"{{\"error\":\"Data with id '{id}' not found\"}}"; e.Context.Response.ContentType = "application/json"; e.Context.Response.StatusCode = (int)HttpStatusCode.NotFound; - WebServer.OutPutStream(e.Context.Response, error); + WebServer.OutputAsStream(e.Context.Response, error); } } } @@ -502,14 +502,14 @@ public class UserController if (user != null) { e.Context.Response.ContentType = "application/json"; - WebServer.OutPutStream(e.Context.Response, JsonConvert.SerializeObject(user)); + WebServer.OutputAsStream(e.Context.Response, JsonConvert.SerializeObject(user)); } else { var error = $"{{\"error\":\"User {userId} not found\"}}"; e.Context.Response.ContentType = "application/json"; e.Context.Response.StatusCode = (int)HttpStatusCode.NotFound; - WebServer.OutPutStream(e.Context.Response, error); + WebServer.OutputAsStream(e.Context.Response, error); } } @@ -530,14 +530,14 @@ public class UserController Value = setting }; e.Context.Response.ContentType = "application/json"; - WebServer.OutPutStream(e.Context.Response, JsonConvert.SerializeObject(response)); + WebServer.OutputAsStream(e.Context.Response, JsonConvert.SerializeObject(response)); } else { var error = $"{{\"error\":\"Setting {settingName} not found for user {userId}\"}}"; e.Context.Response.ContentType = "application/json"; e.Context.Response.StatusCode = (int)HttpStatusCode.NotFound; - WebServer.OutPutStream(e.Context.Response, error); + WebServer.OutputAsStream(e.Context.Response, error); } } @@ -616,7 +616,7 @@ public class SearchController var error = $"{{\"error\":\"Query parameter 'q' is required\"}}"; e.Context.Response.ContentType = "application/json"; e.Context.Response.StatusCode = (int)HttpStatusCode.BadRequest; - WebServer.OutPutStream(e.Context.Response, error); + WebServer.OutputAsStream(e.Context.Response, error); return; } @@ -634,7 +634,7 @@ public class SearchController }; e.Context.Response.ContentType = "application/json"; - WebServer.OutPutStream(e.Context.Response, JsonConvert.SerializeObject(response)); + WebServer.OutputAsStream(e.Context.Response, JsonConvert.SerializeObject(response)); } private object[] PerformSearch(string query, int limit, int offset, string sortBy) @@ -681,7 +681,7 @@ public class ProductController var error = $"{{\"error\":\"Content-Type must be application/json\"}}"; e.Context.Response.ContentType = "application/json"; e.Context.Response.StatusCode = (int)HttpStatusCode.UnsupportedMediaType; - WebServer.OutPutStream(e.Context.Response, error); + WebServer.OutputAsStream(e.Context.Response, error); return; } @@ -699,7 +699,7 @@ public class ProductController var error = $"{{\"error\":\"Missing required field: {field}\"}}"; e.Context.Response.ContentType = "application/json"; e.Context.Response.StatusCode = (int)HttpStatusCode.BadRequest; - WebServer.OutPutStream(e.Context.Response, JsonConvert.SerializeObject(error)); + WebServer.OutputAsStream(e.Context.Response, JsonConvert.SerializeObject(error)); return; } } @@ -710,7 +710,7 @@ public class ProductController var error = $"{{\"error\":\"Price must be a positive number\"}}"; e.Context.Response.ContentType = "application/json"; e.Context.Response.StatusCode = (int)HttpStatusCode.BadRequest; - WebServer.OutPutStream(e.Context.Response, error); + WebServer.OutputAsStream(e.Context.Response, error); return; } @@ -729,14 +729,14 @@ public class ProductController e.Context.Response.ContentType = "application/json"; e.Context.Response.StatusCode = (int)HttpStatusCode.Created; - WebServer.OutPutStream(e.Context.Response, JsonConvert.SerializeObject(response)); + WebServer.OutputAsStream(e.Context.Response, JsonConvert.SerializeObject(response)); } catch (Exception ex) { var error = $"{{\"error\":\"Failed to create product: {ex.Message}\"}}"; e.Context.Response.ContentType = "application/json"; e.Context.Response.StatusCode = (int)HttpStatusCode.InternalServerError; - WebServer.OutPutStream(e.Context.Response, error); + WebServer.OutputAsStream(e.Context.Response, error); } } @@ -775,7 +775,7 @@ public class UploadController }; e.Context.Response.ContentType = "application/json"; - WebServer.OutPutStream(e.Context.Response, JsonConvert.SerializeObject(response)); + WebServer.OutputAsStream(e.Context.Response, JsonConvert.SerializeObject(response)); } else if (contentType == "application/x-www-form-urlencoded") { @@ -794,14 +794,14 @@ public class UploadController }; e.Context.Response.ContentType = "application/json"; - WebServer.OutPutStream(e.Context.Response, JsonConvert.SerializeObject(response)); + WebServer.OutputAsStream(e.Context.Response, JsonConvert.SerializeObject(response)); } else { var error = $"{{\"error\":\"Unsupported content type\"}}"; e.Context.Response.ContentType = "application/json"; e.Context.Response.StatusCode = (int)HttpStatusCode.UnsupportedMediaType; - WebServer.OutPutStream(e.Context.Response, error); + WebServer.OutputAsStream(e.Context.Response, error); } } catch (Exception ex) @@ -809,7 +809,7 @@ public class UploadController var error = $"{{\"error\":\"Upload failed: {ex.Message}\"}}"; e.Context.Response.ContentType = "application/json"; e.Context.Response.StatusCode = (int)HttpStatusCode.InternalServerError; - WebServer.OutPutStream(e.Context.Response, error); + WebServer.OutputAsStream(e.Context.Response, error); } } @@ -884,7 +884,7 @@ public class ResponseController }; e.Context.Response.ContentType = "application/json"; - WebServer.OutPutStream(e.Context.Response, JsonConvert.SerializeObject(data)); + WebServer.OutputAsStream(e.Context.Response, JsonConvert.SerializeObject(data)); } } ``` @@ -914,7 +914,7 @@ public class XmlController "; e.Context.Response.ContentType = "application/xml"; - WebServer.OutPutStream(e.Context.Response, xml); + WebServer.OutputAsStream(e.Context.Response, xml); } } ``` @@ -937,7 +937,7 @@ public class CsvController e.Context.Response.ContentType = "text/csv"; e.Context.Response.Headers.Add("Content-Disposition", "attachment; filename=sensor_data.csv"); - WebServer.OutPutStream(e.Context.Response, csv.ToString()); + WebServer.OutputAsStream(e.Context.Response, csv.ToString()); } } ``` @@ -1017,7 +1017,7 @@ public class ErrorHandlingController response.ContentType = "application/json"; response.StatusCode = (int)statusCode; - WebServer.OutPutStream(response, JsonConvert.SerializeObject(error)); + WebServer.OutputAsStream(response, JsonConvert.SerializeObject(error)); } } ``` @@ -1039,7 +1039,7 @@ public class GlobalErrorHandler e.Context.Response.ContentType = "application/json"; e.Context.Response.StatusCode = (int)HttpStatusCode.InternalServerError; - WebServer.OutPutStream(e.Context.Response, JsonConvert.SerializeObject(error)); + WebServer.OutputAsStream(e.Context.Response, JsonConvert.SerializeObject(error)); } } ``` @@ -1085,20 +1085,20 @@ public class ContentNegotiationController "; e.Context.Response.ContentType = "application/xml"; - WebServer.OutPutStream(e.Context.Response, xml); + WebServer.OutputAsStream(e.Context.Response, xml); } else if (acceptHeader.Contains("text/plain")) { var text = $"Temperature: {data.temperature}°C\nHumidity: {data.humidity}%\nTimestamp: {data.timestamp}"; e.Context.Response.ContentType = "text/plain"; - WebServer.OutPutStream(e.Context.Response, text); + WebServer.OutputAsStream(e.Context.Response, text); } else { // Default to JSON e.Context.Response.ContentType = "application/json"; - WebServer.OutPutStream(e.Context.Response, JsonConvert.SerializeObject(data)); + WebServer.OutputAsStream(e.Context.Response, JsonConvert.SerializeObject(data)); } } } @@ -1128,7 +1128,7 @@ public class SecureApiController }; e.Context.Response.ContentType = "application/json"; - WebServer.OutPutStream(e.Context.Response, JsonConvert.SerializeObject(secureData)); + WebServer.OutputAsStream(e.Context.Response, JsonConvert.SerializeObject(secureData)); } [Route("api/secure/config")] @@ -1147,7 +1147,7 @@ public class SecureApiController }; e.Context.Response.ContentType = "application/json"; - WebServer.OutPutStream(e.Context.Response, JsonConvert.SerializeObject(response)); + WebServer.OutputAsStream(e.Context.Response, JsonConvert.SerializeObject(response)); } } ``` @@ -1222,7 +1222,7 @@ public class IoTDeviceController }; e.Context.Response.ContentType = "application/json"; - WebServer.OutPutStream(e.Context.Response, JsonConvert.SerializeObject(response)); + WebServer.OutputAsStream(e.Context.Response, JsonConvert.SerializeObject(response)); } // GET /api/devices/{id} - Get specific device @@ -1235,7 +1235,7 @@ public class IoTDeviceController if (_devices.Contains(deviceId)) { e.Context.Response.ContentType = "application/json"; - WebServer.OutPutStream(e.Context.Response, JsonConvert.SerializeObject(_devices[deviceId])); + WebServer.OutputAsStream(e.Context.Response, JsonConvert.SerializeObject(_devices[deviceId])); } else { @@ -1257,7 +1257,7 @@ public class IoTDeviceController if (sensorData != null) { e.Context.Response.ContentType = "application/json"; - WebServer.OutPutStream(e.Context.Response, JsonConvert.SerializeObject(sensorData)); + WebServer.OutputAsStream(e.Context.Response, JsonConvert.SerializeObject(sensorData)); } else { @@ -1303,7 +1303,7 @@ public class IoTDeviceController e.Context.Response.ContentType = "application/json"; e.Context.Response.StatusCode = (int)HttpStatusCode.Created; - WebServer.OutPutStream(e.Context.Response, JsonConvert.SerializeObject(device)); + WebServer.OutputAsStream(e.Context.Response, JsonConvert.SerializeObject(device)); } catch (Exception ex) { @@ -1349,7 +1349,7 @@ public class IoTDeviceController currentDevice["lastSeen"] = DateTime.UtcNow.ToString(); e.Context.Response.ContentType = "application/json"; - WebServer.OutPutStream(e.Context.Response, JsonConvert.SerializeObject(currentDevice)); + WebServer.OutputAsStream(e.Context.Response, JsonConvert.SerializeObject(currentDevice)); } catch (Exception ex) { @@ -1380,7 +1380,7 @@ public class IoTDeviceController var result = UpdateSensorConfiguration(deviceId, sensorId, sensorUpdate); e.Context.Response.ContentType = "application/json"; - WebServer.OutPutStream(e.Context.Response, JsonConvert.SerializeObject(result)); + WebServer.OutputAsStream(e.Context.Response, JsonConvert.SerializeObject(result)); } catch (Exception ex) { @@ -1406,7 +1406,7 @@ public class IoTDeviceController }; e.Context.Response.ContentType = "application/json"; - WebServer.OutPutStream(e.Context.Response, JsonConvert.SerializeObject(response)); + WebServer.OutputAsStream(e.Context.Response, JsonConvert.SerializeObject(response)); } else { @@ -1445,7 +1445,7 @@ public class IoTDeviceController var error = $"{{\"error\":\"{message}\"}}"; response.ContentType = "application/json"; response.StatusCode = (int)HttpStatusCode.BadRequest; - WebServer.OutPutStream(response, error); + WebServer.OutputAsStream(response, error); } private void SendNotFound(HttpListenerResponse response, string message) @@ -1453,7 +1453,7 @@ public class IoTDeviceController var error = $"{{\"error\":\"{message}\"}}"; response.ContentType = "application/json"; response.StatusCode = (int)HttpStatusCode.NotFound; - WebServer.OutPutStream(response, error); + WebServer.OutputAsStream(response, error); } private void SendInternalError(HttpListenerResponse response, string message) @@ -1461,7 +1461,7 @@ public class IoTDeviceController var error = $"{{\"error\":\"Internal server error: {message}\"}}"; response.ContentType = "application/json"; response.StatusCode = (int)HttpStatusCode.InternalServerError; - WebServer.OutPutStream(response, error); + WebServer.OutputAsStream(response, error); } } ``` @@ -1505,7 +1505,7 @@ public class BatchController }; e.Context.Response.ContentType = "application/json"; - WebServer.OutPutStream(e.Context.Response, JsonConvert.SerializeObject(response)); + WebServer.OutputAsStream(e.Context.Response, JsonConvert.SerializeObject(response)); } catch (Exception ex) { @@ -1568,7 +1568,7 @@ public class BatchController var error = $"{{\"error\":\"{message}\"}}"; response.ContentType = "application/json"; response.StatusCode = (int)HttpStatusCode.BadRequest; - WebServer.OutPutStream(response, error); + WebServer.OutputAsStream(response, error); } private void SendInternalError(HttpListenerResponse response, string message) @@ -1576,7 +1576,7 @@ public class BatchController var error = $"{{\"error\":\"Internal server error: {message}\"}}"; response.ContentType = "application/json"; response.StatusCode = (int)HttpStatusCode.InternalServerError; - WebServer.OutPutStream(response, error); + WebServer.OutputAsStream(response, error); } } ``` @@ -1610,7 +1610,7 @@ public static class ResponseHelper }; response.ContentType = "application/json"; - WebServer.OutPutStream(response, JsonConvert.SerializeObject(standardResponse)); + WebServer.OutputAsStream(response, JsonConvert.SerializeObject(standardResponse)); } public static void SendErrorResponse(HttpListenerResponse response, HttpStatusCode statusCode, string message) @@ -1624,7 +1624,7 @@ public static class ResponseHelper response.ContentType = "application/json"; response.StatusCode = (int)statusCode; - WebServer.OutPutStream(response, JsonConvert.SerializeObject(standardResponse)); + WebServer.OutputAsStream(response, JsonConvert.SerializeObject(standardResponse)); } } ``` diff --git a/doc/samples.md b/doc/samples.md index 72a38b6..ade1f83 100644 --- a/doc/samples.md +++ b/doc/samples.md @@ -65,7 +65,7 @@ private static void ServerCommandReceived(object source, WebServerEventArgs e) if (url.ToLower() == "/hello") { - WebServer.OutPutStream(e.Context.Response, "Hello from nanoFramework!"); + WebServer.OutputAsStream(e.Context.Response, "Hello from nanoFramework!"); } else { @@ -100,7 +100,7 @@ private static void ServerCommandReceived(object source, WebServerEventArgs e) } response += ""; - WebServer.OutPutStream(e.Context.Response, response); + WebServer.OutputAsStream(e.Context.Response, response); } } ``` @@ -130,7 +130,7 @@ private static void ServerCommandReceived(object source, WebServerEventArgs e) { // Create a test file File.WriteAllText("I:\\test.txt", "This is a dynamically created file"); - WebServer.OutPutStream(e.Context.Response, "File created successfully"); + WebServer.OutputAsStream(e.Context.Response, "File created successfully"); } } ``` @@ -256,7 +256,7 @@ private static void ServerCommandReceived(object source, WebServerEventArgs e) } // Send response - WebServer.OutPutStream(response, "Request processed successfully"); + WebServer.OutputAsStream(response, "Request processed successfully"); } ``` @@ -272,16 +272,16 @@ private static void ServerCommandReceived(object source, WebServerEventArgs e) switch (url.ToLower()) { case "/": - WebServer.OutPutStream(e.Context.Response, "Welcome to nanoFramework WebServer!"); + WebServer.OutputAsStream(e.Context.Response, "Welcome to nanoFramework WebServer!"); break; case "/time": - WebServer.OutPutStream(e.Context.Response, $"Current time: {DateTime.UtcNow}"); + WebServer.OutputAsStream(e.Context.Response, $"Current time: {DateTime.UtcNow}"); break; case "/info": var info = $"Server running on nanoFramework\nUptime: {Environment.TickCount}ms"; - WebServer.OutPutStream(e.Context.Response, info); + WebServer.OutputAsStream(e.Context.Response, info); break; default: @@ -315,7 +315,7 @@ private static void ServerCommandReceived(object source, WebServerEventArgs e) "; - WebServer.OutPutStream(e.Context.Response, html); + WebServer.OutputAsStream(e.Context.Response, html); } } ``` @@ -341,7 +341,7 @@ private static void ServerCommandReceived(object source, WebServerEventArgs e) ""memory"": {System.GC.GetTotalMemory(false)} }}"; - WebServer.OutPutStream(e.Context.Response, json); + WebServer.OutputAsStream(e.Context.Response, json); } else { @@ -398,12 +398,12 @@ private static void HandleRequest(WebServerEventArgs e) { response += $"{entry}\n"; } - WebServer.OutPutStream(e.Context.Response, response); + WebServer.OutputAsStream(e.Context.Response, response); } else { // Handle other requests - WebServer.OutPutStream(e.Context.Response, "Request processed"); + WebServer.OutputAsStream(e.Context.Response, "Request processed"); } } ``` @@ -486,7 +486,7 @@ private static void HandleJsonRequest(WebServerEventArgs e) // Process JSON and respond e.Context.Response.ContentType = "application/json"; - WebServer.OutPutStream(e.Context.Response, "{\"status\":\"success\"}"); + WebServer.OutputAsStream(e.Context.Response, "{\"status\":\"success\"}"); } ``` @@ -540,7 +540,7 @@ private static void ServerCommandReceived(object source, WebServerEventArgs e) }).Start(); // Return immediate response - WebServer.OutPutStream(e.Context.Response, "Processing started"); + WebServer.OutputAsStream(e.Context.Response, "Processing started"); } } ``` @@ -623,7 +623,7 @@ private static void ServerCommandReceived(object source, WebServerEventArgs e) System.GC.Collect(); response.StatusCode = (int)HttpStatusCode.ServiceUnavailable; - WebServer.OutPutStream(response, "Service temporarily unavailable - low memory"); + WebServer.OutputAsStream(response, "Service temporarily unavailable - low memory"); } catch (System.IO.IOException ioEx) { @@ -687,7 +687,7 @@ private static void ServerCommandReceived(object source, WebServerEventArgs e) ResponseBuilder.Append("Response data: "); ResponseBuilder.Append(DateTime.UtcNow); - WebServer.OutPutStream(e.Context.Response, ResponseBuilder.ToString()); + WebServer.OutputAsStream(e.Context.Response, ResponseBuilder.ToString()); } ``` @@ -706,7 +706,7 @@ private static void ServerCommandReceived(object source, WebServerEventArgs e) if (ResponseCache.Contains(url)) { string cachedResponse = (string)ResponseCache[url]; - WebServer.OutPutStream(e.Context.Response, cachedResponse); + WebServer.OutputAsStream(e.Context.Response, cachedResponse); return; } @@ -719,7 +719,7 @@ private static void ServerCommandReceived(object source, WebServerEventArgs e) ResponseCache[url] = response; } - WebServer.OutPutStream(e.Context.Response, response); + WebServer.OutputAsStream(e.Context.Response, response); } ``` diff --git a/nanoFramework.WebServer.Mcp/McpServerController.cs b/nanoFramework.WebServer.Mcp/McpServerController.cs index 89ba48e..f26a32b 100644 --- a/nanoFramework.WebServer.Mcp/McpServerController.cs +++ b/nanoFramework.WebServer.Mcp/McpServerController.cs @@ -88,7 +88,7 @@ public void HandleMcpRequest(WebServerEventArgs e) if (clientVersion != SupportedVersion) { sb.Append($",\"error\":{{\"code\":-32602,\"message\":\"Unsupported protocol version\",\"data\":{{\"supported\":[\"{SupportedVersion}\"],\"requested\":\"{clientVersion}\"}}}}}}"); - WebServer.OutPutStream(e.Context.Response, sb.ToString()); + WebServer.OutputAsStream(e.Context.Response, sb.ToString()); return; } } @@ -142,13 +142,13 @@ public void HandleMcpRequest(WebServerEventArgs e) Debug.WriteLine($"Response: {sb.ToString()}"); Debug.WriteLine(); - WebServer.OutPutStream(e.Context.Response, sb.ToString()); + WebServer.OutputAsStream(e.Context.Response, sb.ToString()); return; } } catch (Exception ex) { - WebServer.OutPutStream(e.Context.Response, $"{{\"jsonrpc\":\"2.0\",\"id\":{id},\"error\":{{\"code\":-32602,\"message\":\"{ex.Message}\"}}}}"); + WebServer.OutputAsStream(e.Context.Response, $"{{\"jsonrpc\":\"2.0\",\"id\":{id},\"error\":{{\"code\":-32602,\"message\":\"{ex.Message}\"}}}}"); } } } diff --git a/nanoFramework.WebServer/WebServer.cs b/nanoFramework.WebServer/WebServer.cs index c75abb4..1ee5206 100644 --- a/nanoFramework.WebServer/WebServer.cs +++ b/nanoFramework.WebServer/WebServer.cs @@ -176,11 +176,11 @@ public static UrlParameter[] ExtractRouteParameters(string route, string rawUrl, // Remove query parameters from the URL for matching var urlParam = rawUrl.IndexOf(ParamStart); var urlPath = urlParam > 0 ? rawUrl.Substring(0, urlParam) : rawUrl; - + // Normalize the URL path and route for comparison var urlToCompare = caseSensitive ? urlPath : urlPath.ToLower(); var routeToCompare = caseSensitive ? route : route.ToLower(); - + // Ensure both paths start with '/' for consistent segment splitting if (!urlToCompare.StartsWith("/")) { @@ -190,34 +190,34 @@ public static UrlParameter[] ExtractRouteParameters(string route, string rawUrl, { routeToCompare = "/" + routeToCompare; } - + // Split into segments var urlSegments = urlToCompare.Split('/'); var routeSegments = routeToCompare.Split('/'); - + // Number of segments must match if (urlSegments.Length != routeSegments.Length) { return null; } - + ArrayList parameters = new ArrayList(); - + // Compare each segment and extract parameters for (int i = 0; i < routeSegments.Length; i++) { var routeSegment = routeSegments[i]; var urlSegment = urlSegments[i]; - + // Skip empty segments (from leading slash) if (string.IsNullOrEmpty(routeSegment) && string.IsNullOrEmpty(urlSegment)) { continue; } - + // Check if this is a parameter segment (starts and ends with curly braces) - if (routeSegment.Length > 2 && - routeSegment.StartsWith("{") && + if (routeSegment.Length > 2 && + routeSegment.StartsWith("{") && routeSegment.EndsWith("}")) { // Parameter segment matches any non-empty segment that doesn't contain '/' @@ -225,32 +225,32 @@ public static UrlParameter[] ExtractRouteParameters(string route, string rawUrl, { return null; } - + // Extract parameter name (remove curly braces) var paramName = routeSegment.Substring(1, routeSegment.Length - 2); parameters.Add(new UrlParameter { Name = paramName, Value = urlSegments[i] }); // Use original case for value continue; } - + // Exact match required for non-parameter segments if (routeSegment != urlSegment) { return null; } } - + // Convert ArrayList to array if (parameters.Count == 0) { return null; } - + var result = new UrlParameter[parameters.Count]; for (int i = 0; i < parameters.Count; i++) { result[i] = (UrlParameter)parameters[i]; } - + return result; } @@ -536,16 +536,30 @@ public void Stop() /// /// the socket stream /// the stream to output - public static void OutPutStream(HttpListenerResponse response, string strResponse) + [Obsolete("Use OutputAsStream instead. This method will be removed in a future version.")] + public static void OutPutStream(HttpListenerResponse response, string strResponse) => OutputAsStream(response, strResponse); + + /// + /// Output a string content as a stream. + /// + /// The response to write to. + /// the stream to output + public static void OutputAsStream( + HttpListenerResponse response, + string content) { if (response == null) { return; } - byte[] messageBody = Encoding.UTF8.GetBytes(strResponse); + byte[] messageBody = Encoding.UTF8.GetBytes(content); + response.ContentLength64 = messageBody.Length; - response.OutputStream.Write(messageBody, 0, messageBody.Length); + response.OutputStream.Write( + messageBody, + 0, + messageBody.Length); } /// @@ -777,7 +791,7 @@ private void StartListener() { multipleCallback += "."; context.Response.StatusCode = (int)HttpStatusCode.InternalServerError; - OutPutStream(context.Response, multipleCallback); + OutputAsStream(context.Response, multipleCallback); } else { @@ -821,47 +835,47 @@ public static bool IsRouteMatch(CallbackRoutes route, string method, string rawU // Remove query parameters from the URL for matching var urlParam = rawUrl.IndexOf(ParamStart); var urlPath = urlParam > 0 ? rawUrl.Substring(0, urlParam) : rawUrl; - + // Normalize the URL path and route for comparison var urlToCompare = route.CaseSensitive ? urlPath : urlPath.ToLower(); var routeToCompare = route.CaseSensitive ? route.Route : route.Route.ToLower(); - + // Ensure both paths start with '/' for consistent segment splitting if (!urlToCompare.StartsWith("/")) { urlToCompare = "/" + urlToCompare; } - + if (!routeToCompare.StartsWith("/")) { routeToCompare = "/" + routeToCompare; } - + // Split into segments var urlSegments = urlToCompare.Split('/'); var routeSegments = routeToCompare.Split('/'); - + // Number of segments must match if (urlSegments.Length != routeSegments.Length) { return false; } - + // Compare each segment for (int i = 0; i < routeSegments.Length; i++) { var routeSegment = routeSegments[i]; var urlSegment = urlSegments[i]; - + // Skip empty segments (from leading slash) if (string.IsNullOrEmpty(routeSegment) && string.IsNullOrEmpty(urlSegment)) { continue; } - + // Check if this is a parameter segment (starts and ends with curly braces) - if (routeSegment.Length > 2 && - routeSegment.StartsWith("{") && + if (routeSegment.Length > 2 && + routeSegment.StartsWith("{") && routeSegment.EndsWith("}")) { // Parameter segment matches any non-empty segment that doesn't contain '/' @@ -872,14 +886,14 @@ public static bool IsRouteMatch(CallbackRoutes route, string method, string rawU // Parameter matches, continue to next segment continue; } - + // Exact match required for non-parameter segments if (routeSegment != urlSegment) { return false; } } - + return true; } @@ -892,12 +906,12 @@ protected virtual void InvokeRoute(CallbackRoutes route, HttpListenerContext con { // Extract route parameters if the route contains parameter placeholders var routeParameters = ExtractRouteParameters(route.Route, context.Request.RawUrl, route.CaseSensitive); - + // Create WebServerEventArgs with or without route parameters - var eventArgs = routeParameters != null + var eventArgs = routeParameters != null ? new WebServerEventArgs(context, routeParameters) : new WebServerEventArgs(context); - + route.Callback.Invoke(null, new object[] { eventArgs }); } diff --git a/tests/WebServerE2ETests/MixedController.cs b/tests/WebServerE2ETests/MixedController.cs index 1e2bcab..386bc55 100644 --- a/tests/WebServerE2ETests/MixedController.cs +++ b/tests/WebServerE2ETests/MixedController.cs @@ -12,13 +12,13 @@ class MixedController [Authentication("ApiKey:superKey1234")] public void ApiKeyAndPublicApiKey(WebServerEventArgs e) { - WebServer.OutPutStream(e.Context.Response, "ApiKey+Public: ApiKey"); + WebServer.OutputAsStream(e.Context.Response, "ApiKey+Public: ApiKey"); } [Route("authapikeyandpublic")] public void ApiKeyAndPublicPublic(WebServerEventArgs e) { - WebServer.OutPutStream(e.Context.Response, "ApiKey+Public: Public"); + WebServer.OutputAsStream(e.Context.Response, "ApiKey+Public: Public"); } #endregion @@ -27,13 +27,13 @@ public void ApiKeyAndPublicPublic(WebServerEventArgs e) [Authentication("Basic:user2 password")] public void BasicAndPublicBasic(WebServerEventArgs e) { - WebServer.OutPutStream(e.Context.Response, "Basic+Public: Basic"); + WebServer.OutputAsStream(e.Context.Response, "Basic+Public: Basic"); } [Route("authbasicandpublic")] public void BasicAndPublicPublic(WebServerEventArgs e) { - WebServer.OutPutStream(e.Context.Response, "Basic+Public: Public"); + WebServer.OutputAsStream(e.Context.Response, "Basic+Public: Public"); } #endregion @@ -41,35 +41,35 @@ public void BasicAndPublicPublic(WebServerEventArgs e) [Route("authapikeybasicandpublic")] public void ApiKeyBasicAndPublicPublic(WebServerEventArgs e) { - WebServer.OutPutStream(e.Context.Response, "ApiKey+Basic+Public: Public"); + WebServer.OutputAsStream(e.Context.Response, "ApiKey+Basic+Public: Public"); } [Route("authapikeybasicandpublic")] [Authentication("Basic:user3 password")] public void ApiKeyBasicAndPublicBasic3(WebServerEventArgs e) { - WebServer.OutPutStream(e.Context.Response, "ApiKey+Basic+Public: Basic user3"); + WebServer.OutputAsStream(e.Context.Response, "ApiKey+Basic+Public: Basic user3"); } [Route("authapikeybasicandpublic")] [Authentication("Basic:user2 password")] public void ApiKeyBasicAndPublicBasic2(WebServerEventArgs e) { - WebServer.OutPutStream(e.Context.Response, "ApiKey+Basic+Public: Basic user2"); + WebServer.OutputAsStream(e.Context.Response, "ApiKey+Basic+Public: Basic user2"); } [Authentication("ApiKey:superKey1234")] [Route("authapikeybasicandpublic")] public void ApiKeyBasicAndPublicApiKey(WebServerEventArgs e) { - WebServer.OutPutStream(e.Context.Response, "ApiKey+Basic+Public: ApiKey"); + WebServer.OutputAsStream(e.Context.Response, "ApiKey+Basic+Public: ApiKey"); } [Authentication("ApiKey:superKey42")] [Route("authapikeybasicandpublic")] public void ApiKeyBasicAndPublicApiKey2(WebServerEventArgs e) { - WebServer.OutPutStream(e.Context.Response, "ApiKey+Basic+Public: ApiKey 2"); + WebServer.OutputAsStream(e.Context.Response, "ApiKey+Basic+Public: ApiKey 2"); } #endregion @@ -77,43 +77,42 @@ public void ApiKeyBasicAndPublicApiKey2(WebServerEventArgs e) [Route("authmultiple")] public void MultiplePublic1(WebServerEventArgs e) { - WebServer.OutPutStream(e.Context.Response, "Multiple: Public1"); + WebServer.OutputAsStream(e.Context.Response, "Multiple: Public1"); } [Route("authmultiple")] [Authentication("Basic:user2 password")] public void MultipleBasic1(WebServerEventArgs e) { - WebServer.OutPutStream(e.Context.Response, "Multiple: Basic1"); + WebServer.OutputAsStream(e.Context.Response, "Multiple: Basic1"); } [Route("authmultiple")] public void MultiplePublic2(WebServerEventArgs e) { - WebServer.OutPutStream(e.Context.Response, "Multiple: Public2"); + WebServer.OutputAsStream(e.Context.Response, "Multiple: Public2"); } [Authentication("ApiKey:superKey1234")] [Route("authmultiple")] public void MultipleApiKey1(WebServerEventArgs e) { - WebServer.OutPutStream(e.Context.Response, "Multiple: ApiKey1"); + WebServer.OutputAsStream(e.Context.Response, "Multiple: ApiKey1"); } [Route("authmultiple")] [Authentication("Basic:user2 password")] public void MultipleBasic2(WebServerEventArgs e) { - WebServer.OutPutStream(e.Context.Response, "Multiple: Basic2"); + WebServer.OutputAsStream(e.Context.Response, "Multiple: Basic2"); } [Authentication("ApiKey:superKey1234")] [Route("authmultiple")] public void MultipleApiKey2(WebServerEventArgs e) { - WebServer.OutPutStream(e.Context.Response, "Multiple: ApiKey2"); + WebServer.OutputAsStream(e.Context.Response, "Multiple: ApiKey2"); } #endregion } } - diff --git a/tests/WebServerE2ETests/PostPutController.cs b/tests/WebServerE2ETests/PostPutController.cs index f404f8e..0a9f67d 100644 --- a/tests/WebServerE2ETests/PostPutController.cs +++ b/tests/WebServerE2ETests/PostPutController.cs @@ -16,7 +16,7 @@ public void Post(WebServerEventArgs e) byte[] buff = new byte[e.Context.Request.InputStream.Length]; e.Context.Request.InputStream.Read(buff, 0, buff.Length); var txt = e.Context.Request.ContentType.Contains("text") ? System.Text.Encoding.UTF8.GetString(buff, 0, buff.Length) : BitConverter.ToString(buff); - WebServer.OutPutStream(e.Context.Response, $"POST: {txt}"); + WebServer.OutputAsStream(e.Context.Response, $"POST: {txt}"); } [Method("PUT")] @@ -26,7 +26,7 @@ public void Put(WebServerEventArgs e) byte[] buff = new byte[e.Context.Request.InputStream.Length]; e.Context.Request.InputStream.Read(buff, 0, buff.Length); var txt = e.Context.Request.ContentType.Contains("text") ? System.Text.Encoding.UTF8.GetString(buff, 0, buff.Length) : BitConverter.ToString(buff); - WebServer.OutPutStream(e.Context.Response, $"PUT: {txt}"); + WebServer.OutputAsStream(e.Context.Response, $"PUT: {txt}"); } } diff --git a/tests/WebServerE2ETests/Program.cs b/tests/WebServerE2ETests/Program.cs index ef38cb6..4d5c90c 100644 --- a/tests/WebServerE2ETests/Program.cs +++ b/tests/WebServerE2ETests/Program.cs @@ -69,7 +69,7 @@ private static void ServerCommandReceived(object obj, WebServerEventArgs e) toOutput += $"Parameter name: {par.Name}, Value: {par.Value}
"; } toOutput += ""; - WebServer.OutPutStream(e.Context.Response, toOutput); + WebServer.OutputAsStream(e.Context.Response, toOutput); return; } else if (url.IndexOf("/Text.txt") == 0) @@ -97,7 +97,7 @@ private static void ServerCommandReceived(object obj, WebServerEventArgs e) } else { - WebServer.OutPutStream(e.Context.Response, "" + + WebServer.OutputAsStream(e.Context.Response, "" + "Hi from nanoFramework ServerYou want me to say hello in a real HTML page!
Generate an internal text.txt file
" + "Download the Text.txt file
" + "Try this url with parameters: /param.htm?param1=42&second=24&NAme=Ellerbach"); diff --git a/tests/WebServerE2ETests/SimpleRouteController.cs b/tests/WebServerE2ETests/SimpleRouteController.cs index f1a1e5b..0b3d7aa 100644 --- a/tests/WebServerE2ETests/SimpleRouteController.cs +++ b/tests/WebServerE2ETests/SimpleRouteController.cs @@ -27,7 +27,7 @@ public void OutputWithNotFoundCode(WebServerEventArgs e) public void OutputWithOKText(WebServerEventArgs e) { Debug.WriteLine($"{nameof(OutputWithOKText)} {e.Context.Request.HttpMethod} {e.Context.Request.RawUrl}"); - WebServer.OutPutStream(e.Context.Response, "OK"); + WebServer.OutputAsStream(e.Context.Response, "OK"); } [Route("test"), Route("Test2"), Route("tEst42"), Route("TEST")] @@ -37,7 +37,7 @@ public void RouteGetTest(WebServerEventArgs e) { string route = $"The route asked is {e.Context.Request.RawUrl.TrimStart('/').Split('/')[0]}"; e.Context.Response.ContentType = "text/plain"; - WebServer.OutPutStream(e.Context.Response, route); + WebServer.OutputAsStream(e.Context.Response, route); } [Route("test/any")] @@ -50,14 +50,14 @@ public void RouteAnyTest(WebServerEventArgs e) public void FirstOfMultipleCallback(WebServerEventArgs e) { Debug.WriteLine($"{nameof(FirstOfMultipleCallback)} {e.Context.Request.HttpMethod} {e.Context.Request.RawUrl}"); - WebServer.OutPutStream(e.Context.Response, nameof(FirstOfMultipleCallback)); + WebServer.OutputAsStream(e.Context.Response, nameof(FirstOfMultipleCallback)); } [Route("multiplecallback")] public void SecondOfMultipleCallback(WebServerEventArgs e) { Debug.WriteLine($"{nameof(SecondOfMultipleCallback)} {e.Context.Request.HttpMethod} {e.Context.Request.RawUrl}"); - WebServer.OutPutStream(e.Context.Response, nameof(SecondOfMultipleCallback)); + WebServer.OutputAsStream(e.Context.Response, nameof(SecondOfMultipleCallback)); } } }