c - 用于 Web 路由的 C 语言高效字符串解析

标签 c rest

我正在为一个 super 旧的网络服务器编写一个小钩子(Hook),该服务器无法以其他方式升级(除非像这样手动升级)。它是用 C 编写的,并提供了足够的准系统内容 - 设置 header 、mime 类型等。它有自己的路由,但只能返回静态文件。

我测试了一个简单的 Web 路由系统,该系统仅使用 strstr 来查看是否调用了某个请求;然后我返回一些 JSON 数据。我想知道的是如何从头开始高效地编写一个Web路由过程。我的产品非常专业,一次只有一个用户使用,并且 Web 访问通常只是为了设置,所以我根本不担心每秒 100 个请求。对于微小的突发,最大可能是每秒 5-10 个请求,然后空闲时每秒可能有 1 个请求。

我认为这会涉及诸如标记化之类的事情,或者可能只是使用正则表达式。如果有必要,我会学习这些东西。

TLDR:如何以最有效的方式编写此内容?

  /* requestPtr->path = "/user/123" */

   if(strstr(requestPtr->path, "/user/123") != NULL)
   {
       /* process the request */
   }
   else if(strstr(requestPtr->path, "/config/settings") != NULL)
   {
       /* process the request */
   }
   else if(/* and on and on */ )...

最佳答案

strstr 在失败之前搜索整个字符串长度以查找匹配项。

如果这些匹配始终来自根,或者对于所有来自根的匹配,您可以使用 strncmp,其中输入 n 作为测试字符串的长度,[或 sizeof("/user/123/")-1 将在编译时解决]。当字符串/不/匹配时,这会明显更快。

请注意,我建议您在适当的时候始终在路径中包含尾随/,因为它会阻止您将/user/123 与/user/1234 进行匹配

如果您有一些总是寻找路径末尾的比较,您可以在字符串中创建一个指针,以获得距末尾的正确偏移量并使用 strcmp。您可以在进行任何比较之前对 pathstr 执行一个 strlen,并记住检查 pathstr 是否足够长以在每种情况下进行减法!

如果您确实需要完整路径元素的中间位置匹配,则放入一个外部循环来查找路径字符串中的每个/,然后在循环内依次 strncmp 每个测试字符串。

如果您确实没有完整的路径元素,即您希望 user/123 匹配 my_user/12345,但您的测试字符串至少包含 1 个斜杠,您可以记录该斜杠的字符偏移量,也许作为第一个测试字符串的字节(yuck)“\004user/123”,并且在上面的循环中,strncmp从后面那么多字符,如果你至少有那么多字符。

只有当你有单个路径元素的片段时,你才会诉诸strstr

关于c - 用于 Web 路由的 C 语言高效字符串解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46896385/

相关文章:

c++ - 更改 Windows 资源管理器中的当前路径

c - 处理系统时间变化

Java:JPA/JSON/REST 往返工作流程

java - 如何在spring mvc中将用户表单数据发送到服务器

http - 浏览器扩展想法 : Provide HTTP Auth Values through Web Forms

c# - C to C# CRC计算转换器

c - 指向结构的指针数组

c - 不使用 OpenMAX 在 Raspberry Pi 中解码视频?

node.js - 如何在微服务/事件驱动架构中处理 HTTP 请求?

rest - GitHub API v4 : How can I traverse with pagination?(GraphQL)