{"id":15831582,"url":"https://github.com/somajitdey/sertain","last_synced_at":"2025-10-15T19:49:36.052Z","repository":{"id":163920171,"uuid":"363463346","full_name":"SomajitDey/sertain","owner":"SomajitDey","description":"Simple Bash library for building a basic HTTP server.","archived":false,"fork":false,"pushed_at":"2021-05-18T10:43:33.000Z","size":4339,"stargazers_count":4,"open_issues_count":0,"forks_count":1,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-05-12T13:12:03.501Z","etag":null,"topics":["bash","http","http-server","http-server-library","shell-functions","shell-scripting"],"latest_commit_sha":null,"homepage":"","language":"Shell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/SomajitDey.png","metadata":{"files":{"readme":"README.html","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2021-05-01T17:02:38.000Z","updated_at":"2023-02-10T19:52:39.000Z","dependencies_parsed_at":null,"dependency_job_id":"8cb3f646-8a7c-46b5-96ed-4f09155eb385","html_url":"https://github.com/SomajitDey/sertain","commit_stats":{"total_commits":4,"total_committers":1,"mean_commits":4.0,"dds":0.0,"last_synced_commit":"a3da39b67813f001cb618a6b2d1935b3113d37f2"},"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SomajitDey%2Fsertain","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SomajitDey%2Fsertain/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SomajitDey%2Fsertain/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SomajitDey%2Fsertain/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/SomajitDey","download_url":"https://codeload.github.com/SomajitDey/sertain/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":253745175,"owners_count":21957318,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["bash","http","http-server","http-server-library","shell-functions","shell-scripting"],"created_at":"2024-10-05T12:04:43.615Z","updated_at":"2025-10-15T19:49:31.033Z","avatar_url":"https://github.com/SomajitDey.png","language":"Shell","readme":"\u003c!doctype html\u003e\n\u003chtml\u003e\n\u003chead\u003e\n\u003cmeta charset='UTF-8'\u003e\u003cmeta name='viewport' content='width=device-width initial-scale=1'\u003e\n\n\u003clink href='https://fonts.loli.net/css?family=Open+Sans:400italic,700italic,700,400\u0026subset=latin,latin-ext' rel='stylesheet' type='text/css' /\u003e\u003cstyle type='text/css'\u003ehtml {overflow-x: initial !important;}:root { --bg-color:#ffffff; --text-color:#333333; --select-text-bg-color:#B5D6FC; --select-text-font-color:auto; --monospace:\"Lucida Console\",Consolas,\"Courier\",monospace; --title-bar-height:20px; }\n.mac-os-11 { --title-bar-height:28px; }\nhtml { font-size: 14px; background-color: var(--bg-color); color: var(--text-color); font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif; -webkit-font-smoothing: antialiased; }\nbody { margin: 0px; padding: 0px; height: auto; bottom: 0px; top: 0px; left: 0px; right: 0px; font-size: 1rem; line-height: 1.42857; overflow-x: hidden; background: inherit; tab-size: 4; }\niframe { margin: auto; }\na.url { word-break: break-all; }\na:active, a:hover { outline: 0px; }\n.in-text-selection, ::selection { text-shadow: none; background: var(--select-text-bg-color); color: var(--select-text-font-color); }\n#write { margin: 0px auto; height: auto; width: inherit; word-break: normal; overflow-wrap: break-word; position: relative; white-space: normal; overflow-x: visible; padding-top: 36px; }\n#write.first-line-indent p { text-indent: 2em; }\n#write.first-line-indent li p, #write.first-line-indent p * { text-indent: 0px; }\n#write.first-line-indent li { margin-left: 2em; }\n.for-image #write { padding-left: 8px; padding-right: 8px; }\nbody.typora-export { padding-left: 30px; padding-right: 30px; }\n.typora-export .footnote-line, .typora-export li, .typora-export p { white-space: pre-wrap; }\n.typora-export .task-list-item input { pointer-events: none; }\n@media screen and (max-width: 500px) {\n  body.typora-export { padding-left: 0px; padding-right: 0px; }\n  #write { padding-left: 20px; padding-right: 20px; }\n  .CodeMirror-sizer { margin-left: 0px !important; }\n  .CodeMirror-gutters { display: none !important; }\n}\n#write li \u003e figure:last-child { margin-bottom: 0.5rem; }\n#write ol, #write ul { position: relative; }\nimg { max-width: 100%; vertical-align: middle; image-orientation: from-image; }\nbutton, input, select, textarea { color: inherit; font: inherit; }\ninput[type=\"checkbox\"], input[type=\"radio\"] { line-height: normal; padding: 0px; }\n*, ::after, ::before { box-sizing: border-box; }\n#write h1, #write h2, #write h3, #write h4, #write h5, #write h6, #write p, #write pre { width: inherit; }\n#write h1, #write h2, #write h3, #write h4, #write h5, #write h6, #write p { position: relative; }\np { line-height: inherit; }\nh1, h2, h3, h4, h5, h6 { break-after: avoid-page; break-inside: avoid; orphans: 4; }\np { orphans: 4; }\nh1 { font-size: 2rem; }\nh2 { font-size: 1.8rem; }\nh3 { font-size: 1.6rem; }\nh4 { font-size: 1.4rem; }\nh5 { font-size: 1.2rem; }\nh6 { font-size: 1rem; }\n.md-math-block, .md-rawblock, h1, h2, h3, h4, h5, h6, p { margin-top: 1rem; margin-bottom: 1rem; }\n.hidden { display: none; }\n.md-blockmeta { color: rgb(204, 204, 204); font-weight: 700; font-style: italic; }\na { cursor: pointer; }\nsup.md-footnote { padding: 2px 4px; background-color: rgba(238, 238, 238, 0.7); color: rgb(85, 85, 85); border-radius: 4px; cursor: pointer; }\nsup.md-footnote a, sup.md-footnote a:hover { color: inherit; text-transform: inherit; text-decoration: inherit; }\n#write input[type=\"checkbox\"] { cursor: pointer; width: inherit; height: inherit; }\nfigure { overflow-x: auto; margin: 1.2em 0px; max-width: calc(100% + 16px); padding: 0px; }\nfigure \u003e table { margin: 0px; }\ntr { break-inside: avoid; break-after: auto; }\nthead { display: table-header-group; }\ntable { border-collapse: collapse; border-spacing: 0px; width: 100%; overflow: auto; break-inside: auto; text-align: left; }\ntable.md-table td { min-width: 32px; }\n.CodeMirror-gutters { border-right: 0px; background-color: inherit; }\n.CodeMirror-linenumber { user-select: none; }\n.CodeMirror { text-align: left; }\n.CodeMirror-placeholder { opacity: 0.3; }\n.CodeMirror pre { padding: 0px 4px; }\n.CodeMirror-lines { padding: 0px; }\ndiv.hr:focus { cursor: none; }\n#write pre { white-space: pre-wrap; }\n#write.fences-no-line-wrapping pre { white-space: pre; }\n#write pre.ty-contain-cm { white-space: normal; }\n.CodeMirror-gutters { margin-right: 4px; }\n.md-fences { font-size: 0.9rem; display: block; break-inside: avoid; text-align: left; overflow: visible; white-space: pre; background: inherit; position: relative !important; }\n.md-fences-adv-panel { width: 100%; margin-top: 10px; text-align: center; padding-top: 0px; padding-bottom: 8px; overflow-x: auto; }\n#write .md-fences.mock-cm { white-space: pre-wrap; }\n.md-fences.md-fences-with-lineno { padding-left: 0px; }\n#write.fences-no-line-wrapping .md-fences.mock-cm { white-space: pre; overflow-x: auto; }\n.md-fences.mock-cm.md-fences-with-lineno { padding-left: 8px; }\n.CodeMirror-line, twitterwidget { break-inside: avoid; }\n.footnotes { opacity: 0.8; font-size: 0.9rem; margin-top: 1em; margin-bottom: 1em; }\n.footnotes + .footnotes { margin-top: 0px; }\n.md-reset { margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: top; background: 0px 0px; text-decoration: none; text-shadow: none; float: none; position: static; width: auto; height: auto; white-space: nowrap; cursor: inherit; -webkit-tap-highlight-color: transparent; line-height: normal; font-weight: 400; text-align: left; box-sizing: content-box; direction: ltr; }\nli div { padding-top: 0px; }\nblockquote { margin: 1rem 0px; }\nli .mathjax-block, li p { margin: 0.5rem 0px; }\nli blockquote { margin: 1rem 0px; }\nli { margin: 0px; position: relative; }\nblockquote \u003e :last-child { margin-bottom: 0px; }\nblockquote \u003e :first-child, li \u003e :first-child { margin-top: 0px; }\n.footnotes-area { color: rgb(136, 136, 136); margin-top: 0.714rem; padding-bottom: 0.143rem; white-space: normal; }\n#write .footnote-line { white-space: pre-wrap; }\n@media print {\n  body, html { border: 1px solid transparent; height: 99%; break-after: avoid; break-before: avoid; font-variant-ligatures: no-common-ligatures; }\n  #write { margin-top: 0px; padding-top: 0px; border-color: transparent !important; }\n  .typora-export * { -webkit-print-color-adjust: exact; }\n  .typora-export #write { break-after: avoid; }\n  .typora-export #write::after { height: 0px; }\n  .is-mac table { break-inside: avoid; }\n}\n.footnote-line { margin-top: 0.714em; font-size: 0.7em; }\na img, img a { cursor: pointer; }\npre.md-meta-block { font-size: 0.8rem; min-height: 0.8rem; white-space: pre-wrap; background: rgb(204, 204, 204); display: block; overflow-x: hidden; }\np \u003e .md-image:only-child:not(.md-img-error) img, p \u003e img:only-child { display: block; margin: auto; }\n#write.first-line-indent p \u003e .md-image:only-child:not(.md-img-error) img { left: -2em; position: relative; }\np \u003e .md-image:only-child { display: inline-block; width: 100%; }\n#write .MathJax_Display { margin: 0.8em 0px 0px; }\n.md-math-block { width: 100%; }\n.md-math-block:not(:empty)::after { display: none; }\n.MathJax_ref { fill: currentcolor; }\n[contenteditable=\"true\"]:active, [contenteditable=\"true\"]:focus, [contenteditable=\"false\"]:active, [contenteditable=\"false\"]:focus { outline: 0px; box-shadow: none; }\n.md-task-list-item { position: relative; list-style-type: none; }\n.task-list-item.md-task-list-item { padding-left: 0px; }\n.md-task-list-item \u003e input { position: absolute; top: 0px; left: 0px; margin-left: -1.2em; margin-top: calc(1em - 10px); border: none; }\n.math { font-size: 1rem; }\n.md-toc { min-height: 3.58rem; position: relative; font-size: 0.9rem; border-radius: 10px; }\n.md-toc-content { position: relative; margin-left: 0px; }\n.md-toc-content::after, .md-toc::after { display: none; }\n.md-toc-item { display: block; color: rgb(65, 131, 196); }\n.md-toc-item a { text-decoration: none; }\n.md-toc-inner:hover { text-decoration: underline; }\n.md-toc-inner { display: inline-block; cursor: pointer; }\n.md-toc-h1 .md-toc-inner { margin-left: 0px; font-weight: 700; }\n.md-toc-h2 .md-toc-inner { margin-left: 2em; }\n.md-toc-h3 .md-toc-inner { margin-left: 4em; }\n.md-toc-h4 .md-toc-inner { margin-left: 6em; }\n.md-toc-h5 .md-toc-inner { margin-left: 8em; }\n.md-toc-h6 .md-toc-inner { margin-left: 10em; }\n@media screen and (max-width: 48em) {\n  .md-toc-h3 .md-toc-inner { margin-left: 3.5em; }\n  .md-toc-h4 .md-toc-inner { margin-left: 5em; }\n  .md-toc-h5 .md-toc-inner { margin-left: 6.5em; }\n  .md-toc-h6 .md-toc-inner { margin-left: 8em; }\n}\na.md-toc-inner { font-size: inherit; font-style: inherit; font-weight: inherit; line-height: inherit; }\n.footnote-line a:not(.reversefootnote) { color: inherit; }\n.md-attr { display: none; }\n.md-fn-count::after { content: \".\"; }\ncode, pre, samp, tt { font-family: var(--monospace); }\nkbd { margin: 0px 0.1em; padding: 0.1em 0.6em; font-size: 0.8em; color: rgb(36, 39, 41); background: rgb(255, 255, 255); border: 1px solid rgb(173, 179, 185); border-radius: 3px; box-shadow: rgba(12, 13, 14, 0.2) 0px 1px 0px, rgb(255, 255, 255) 0px 0px 0px 2px inset; white-space: nowrap; vertical-align: middle; }\n.md-comment { color: rgb(162, 127, 3); opacity: 0.8; font-family: var(--monospace); }\ncode { text-align: left; vertical-align: initial; }\na.md-print-anchor { white-space: pre !important; border-width: initial !important; border-style: none !important; border-color: initial !important; display: inline-block !important; position: absolute !important; width: 1px !important; right: 0px !important; outline: 0px !important; background: 0px 0px !important; text-decoration: initial !important; text-shadow: initial !important; }\n.md-inline-math .MathJax_SVG .noError { display: none !important; }\n.html-for-mac .inline-math-svg .MathJax_SVG { vertical-align: 0.2px; }\n.md-fences-math .MathJax_SVG_Display, .md-math-block .MathJax_SVG_Display { text-align: center; margin: 0px; position: relative; text-indent: 0px; max-width: none; max-height: none; min-height: 0px; min-width: 100%; width: auto; overflow-y: visible; display: block !important; }\n.MathJax_SVG_Display, .md-inline-math .MathJax_SVG_Display { width: auto; margin: inherit; display: inline-block !important; }\n.MathJax_SVG .MJX-monospace { font-family: var(--monospace); }\n.MathJax_SVG .MJX-sans-serif { font-family: sans-serif; }\n.MathJax_SVG { display: inline; font-style: normal; font-weight: 400; line-height: normal; text-indent: 0px; text-align: left; text-transform: none; letter-spacing: normal; word-spacing: normal; overflow-wrap: normal; white-space: nowrap; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border: 0px; padding: 0px; margin: 0px; }\n.MathJax_SVG * { transition: none 0s ease 0s; }\n.MathJax_SVG_Display svg { vertical-align: middle !important; margin-bottom: 0px !important; margin-top: 0px !important; }\n.os-windows.monocolor-emoji .md-emoji { font-family: \"Segoe UI Symbol\", sans-serif; }\n.md-diagram-panel \u003e svg { max-width: 100%; }\n[lang=\"flow\"] svg, [lang=\"mermaid\"] svg { max-width: 100%; height: auto; }\n[lang=\"mermaid\"] .node text { font-size: 1rem; }\ntable tr th { border-bottom: 0px; }\nvideo { max-width: 100%; display: block; margin: 0px auto; }\niframe { max-width: 100%; width: 100%; border: none; }\n.highlight td, .highlight tr { border: 0px; }\nmark { background: rgb(255, 255, 0); color: rgb(0, 0, 0); }\n.md-html-inline .md-plain, .md-html-inline strong, mark .md-inline-math, mark strong { color: inherit; }\n.md-expand mark .md-meta { opacity: 0.3 !important; }\nmark .md-meta { color: rgb(0, 0, 0); }\n@media print {\n  .typora-export h1, .typora-export h2, .typora-export h3, .typora-export h4, .typora-export h5, .typora-export h6 { break-inside: avoid; }\n}\n.md-diagram-panel .messageText { stroke: none !important; }\n.md-diagram-panel .start-state { fill: var(--node-fill); }\n.md-diagram-panel .edgeLabel rect { opacity: 1 !important; }\n.md-require-zoom-fix foreignobject { font-size: var(--mermaid-font-zoom); }\n.md-fences.md-fences-math { font-size: 1em; }\n.md-fences-math .MathJax_SVG_Display { margin-top: 8px; cursor: default; }\n.md-fences-advanced:not(.md-focus) { padding: 0px; white-space: nowrap; border: 0px; }\n.md-fences-advanced:not(.md-focus) { background: inherit; }\n.typora-export-show-outline .typora-export-content { max-width: 1440px; margin: auto; display: flex; flex-direction: row; }\n.typora-export-sidebar { width: 300px; font-size: 0.8rem; margin-top: 80px; margin-right: 18px; }\n.typora-export-show-outline #write { --webkit-flex:2; flex: 2 1 0%; }\n.typora-export-sidebar .outline-content { position: fixed; top: 0px; max-height: 100%; overflow: hidden auto; padding-bottom: 30px; padding-top: 60px; width: 300px; }\n@media screen and (max-width: 1024px) {\n  .typora-export-sidebar, .typora-export-sidebar .outline-content { width: 240px; }\n}\n@media screen and (max-width: 800px) {\n  .typora-export-sidebar { display: none; }\n}\n.outline-content li, .outline-content ul { margin-left: 0px; margin-right: 0px; padding-left: 0px; padding-right: 0px; list-style: none; }\n.outline-content ul { margin-top: 0px; margin-bottom: 0px; }\n.outline-content strong { font-weight: 400; }\n.outline-expander { width: 1rem; height: 1.42857rem; position: relative; display: table-cell; vertical-align: middle; cursor: pointer; padding-left: 4px; }\n.outline-expander::before { content: \"\"; position: relative; font-family: Ionicons; display: inline-block; font-size: 8px; vertical-align: middle; }\n.outline-item { padding-top: 3px; padding-bottom: 3px; cursor: pointer; }\n.outline-expander:hover::before { content: \"\"; }\n.outline-h1 \u003e .outline-item { padding-left: 0px; }\n.outline-h2 \u003e .outline-item { padding-left: 1em; }\n.outline-h3 \u003e .outline-item { padding-left: 2em; }\n.outline-h4 \u003e .outline-item { padding-left: 3em; }\n.outline-h5 \u003e .outline-item { padding-left: 4em; }\n.outline-h6 \u003e .outline-item { padding-left: 5em; }\n.outline-label { cursor: pointer; display: table-cell; vertical-align: middle; text-decoration: none; color: inherit; }\n.outline-label:hover { text-decoration: underline; }\n.outline-item:hover { border-color: rgb(245, 245, 245); background-color: var(--item-hover-bg-color); }\n.outline-item:hover { margin-left: -28px; margin-right: -28px; border-left: 28px solid transparent; border-right: 28px solid transparent; }\n.outline-item-single .outline-expander::before, .outline-item-single .outline-expander:hover::before { display: none; }\n.outline-item-open \u003e .outline-item \u003e .outline-expander::before { content: \"\"; }\n.outline-children { display: none; }\n.info-panel-tab-wrapper { display: none; }\n.outline-item-open \u003e .outline-children { display: block; }\n.typora-export .outline-item { padding-top: 1px; padding-bottom: 1px; }\n.typora-export .outline-item:hover { margin-right: -8px; border-right: 8px solid transparent; }\n.typora-export .outline-expander::before { content: \"+\"; font-family: inherit; top: -1px; }\n.typora-export .outline-expander:hover::before, .typora-export .outline-item-open \u003e .outline-item \u003e .outline-expander::before { content: \"−\"; }\n.typora-export-collapse-outline .outline-children { display: none; }\n.typora-export-collapse-outline .outline-item-open \u003e .outline-children, .typora-export-no-collapse-outline .outline-children { display: block; }\n.typora-export-no-collapse-outline .outline-expander::before { content: \"\" !important; }\n.typora-export-show-outline .outline-item-active \u003e .outline-item .outline-label { font-weight: 700; }\n\n\n:root {\r\n    --side-bar-bg-color: #fafafa;\r\n    --control-text-color: #777;\r\n}\r\n\r\n@include-when-export url(https://fonts.loli.net/css?family=Open+Sans:400italic,700italic,700,400\u0026subset=latin,latin-ext);\r\n\r\n/* open-sans-regular - latin-ext_latin */\r\n  /* open-sans-italic - latin-ext_latin */\r\n    /* open-sans-700 - latin-ext_latin */\r\n    /* open-sans-700italic - latin-ext_latin */\r\n  html {\r\n    font-size: 16px;\r\n}\r\n\r\nbody {\r\n    font-family: \"Open Sans\",\"Clear Sans\", \"Helvetica Neue\", Helvetica, Arial, sans-serif;\r\n    color: rgb(51, 51, 51);\r\n    line-height: 1.6;\r\n}\r\n\r\n#write {\r\n    max-width: 860px;\r\n  \tmargin: 0 auto;\r\n  \tpadding: 30px;\r\n    padding-bottom: 100px;\r\n}\r\n\r\n@media only screen and (min-width: 1400px) {\r\n\t#write {\r\n\t\tmax-width: 1024px;\r\n\t}\r\n}\r\n\r\n@media only screen and (min-width: 1800px) {\r\n\t#write {\r\n\t\tmax-width: 1200px;\r\n\t}\r\n}\r\n\r\n#write \u003e ul:first-child,\r\n#write \u003e ol:first-child{\r\n    margin-top: 30px;\r\n}\r\n\r\na {\r\n    color: #4183C4;\r\n}\r\nh1,\r\nh2,\r\nh3,\r\nh4,\r\nh5,\r\nh6 {\r\n    position: relative;\r\n    margin-top: 1rem;\r\n    margin-bottom: 1rem;\r\n    font-weight: bold;\r\n    line-height: 1.4;\r\n    cursor: text;\r\n}\r\nh1:hover a.anchor,\r\nh2:hover a.anchor,\r\nh3:hover a.anchor,\r\nh4:hover a.anchor,\r\nh5:hover a.anchor,\r\nh6:hover a.anchor {\r\n    text-decoration: none;\r\n}\r\nh1 tt,\r\nh1 code {\r\n    font-size: inherit;\r\n}\r\nh2 tt,\r\nh2 code {\r\n    font-size: inherit;\r\n}\r\nh3 tt,\r\nh3 code {\r\n    font-size: inherit;\r\n}\r\nh4 tt,\r\nh4 code {\r\n    font-size: inherit;\r\n}\r\nh5 tt,\r\nh5 code {\r\n    font-size: inherit;\r\n}\r\nh6 tt,\r\nh6 code {\r\n    font-size: inherit;\r\n}\r\nh1 {\r\n    font-size: 2.25em;\r\n    line-height: 1.2;\r\n    border-bottom: 1px solid #eee;\r\n}\r\nh2 {\r\n    font-size: 1.75em;\r\n    line-height: 1.225;\r\n    border-bottom: 1px solid #eee;\r\n}\r\n\r\n/*@media print {\r\n    .typora-export h1,\r\n    .typora-export h2 {\r\n        border-bottom: none;\r\n        padding-bottom: initial;\r\n    }\r\n\r\n    .typora-export h1::after,\r\n    .typora-export h2::after {\r\n        content: \"\";\r\n        display: block;\r\n        height: 100px;\r\n        margin-top: -96px;\r\n        border-top: 1px solid #eee;\r\n    }\r\n}*/\r\n\r\nh3 {\r\n    font-size: 1.5em;\r\n    line-height: 1.43;\r\n}\r\nh4 {\r\n    font-size: 1.25em;\r\n}\r\nh5 {\r\n    font-size: 1em;\r\n}\r\nh6 {\r\n   font-size: 1em;\r\n    color: #777;\r\n}\r\np,\r\nblockquote,\r\nul,\r\nol,\r\ndl,\r\ntable{\r\n    margin: 0.8em 0;\r\n}\r\nli\u003eol,\r\nli\u003eul {\r\n    margin: 0 0;\r\n}\r\nhr {\r\n    height: 2px;\r\n    padding: 0;\r\n    margin: 16px 0;\r\n    background-color: #e7e7e7;\r\n    border: 0 none;\r\n    overflow: hidden;\r\n    box-sizing: content-box;\r\n}\r\n\r\nli p.first {\r\n    display: inline-block;\r\n}\r\nul,\r\nol {\r\n    padding-left: 30px;\r\n}\r\nul:first-child,\r\nol:first-child {\r\n    margin-top: 0;\r\n}\r\nul:last-child,\r\nol:last-child {\r\n    margin-bottom: 0;\r\n}\r\nblockquote {\r\n    border-left: 4px solid #dfe2e5;\r\n    padding: 0 15px;\r\n    color: #777777;\r\n}\r\nblockquote blockquote {\r\n    padding-right: 0;\r\n}\r\ntable {\r\n    padding: 0;\r\n    word-break: initial;\r\n}\r\ntable tr {\r\n    border: 1px solid #dfe2e5;\r\n    margin: 0;\r\n    padding: 0;\r\n}\r\ntable tr:nth-child(2n),\r\nthead {\r\n    background-color: #f8f8f8;\r\n}\r\ntable th {\r\n    font-weight: bold;\r\n    border: 1px solid #dfe2e5;\r\n    border-bottom: 0;\r\n    margin: 0;\r\n    padding: 6px 13px;\r\n}\r\ntable td {\r\n    border: 1px solid #dfe2e5;\r\n    margin: 0;\r\n    padding: 6px 13px;\r\n}\r\ntable th:first-child,\r\ntable td:first-child {\r\n    margin-top: 0;\r\n}\r\ntable th:last-child,\r\ntable td:last-child {\r\n    margin-bottom: 0;\r\n}\r\n\r\n.CodeMirror-lines {\r\n    padding-left: 4px;\r\n}\r\n\r\n.code-tooltip {\r\n    box-shadow: 0 1px 1px 0 rgba(0,28,36,.3);\r\n    border-top: 1px solid #eef2f2;\r\n}\r\n\r\n.md-fences,\r\ncode,\r\ntt {\r\n    border: 1px solid #e7eaed;\r\n    background-color: #f8f8f8;\r\n    border-radius: 3px;\r\n    padding: 0;\r\n    padding: 2px 4px 0px 4px;\r\n    font-size: 0.9em;\r\n}\r\n\r\ncode {\r\n    background-color: #f3f4f4;\r\n    padding: 0 2px 0 2px;\r\n}\r\n\r\n.md-fences {\r\n    margin-bottom: 15px;\r\n    margin-top: 15px;\r\n    padding-top: 8px;\r\n    padding-bottom: 6px;\r\n}\r\n\r\n\r\n.md-task-list-item \u003e input {\r\n  margin-left: -1.3em;\r\n}\r\n\r\n@media print {\r\n    html {\r\n        font-size: 13px;\r\n    }\r\n    table,\r\n    pre {\r\n        page-break-inside: avoid;\r\n    }\r\n    pre {\r\n        word-wrap: break-word;\r\n    }\r\n}\r\n\r\n.md-fences {\r\n\tbackground-color: #f8f8f8;\r\n}\r\n#write pre.md-meta-block {\r\n\tpadding: 1rem;\r\n    font-size: 85%;\r\n    line-height: 1.45;\r\n    background-color: #f7f7f7;\r\n    border: 0;\r\n    border-radius: 3px;\r\n    color: #777777;\r\n    margin-top: 0 !important;\r\n}\r\n\r\n.mathjax-block\u003e.code-tooltip {\r\n\tbottom: .375rem;\r\n}\r\n\r\n.md-mathjax-midline {\r\n    background: #fafafa;\r\n}\r\n\r\n#write\u003eh3.md-focus:before{\r\n\tleft: -1.5625rem;\r\n\ttop: .375rem;\r\n}\r\n#write\u003eh4.md-focus:before{\r\n\tleft: -1.5625rem;\r\n\ttop: .285714286rem;\r\n}\r\n#write\u003eh5.md-focus:before{\r\n\tleft: -1.5625rem;\r\n\ttop: .285714286rem;\r\n}\r\n#write\u003eh6.md-focus:before{\r\n\tleft: -1.5625rem;\r\n\ttop: .285714286rem;\r\n}\r\n.md-image\u003e.md-meta {\r\n    /*border: 1px solid #ddd;*/\r\n    border-radius: 3px;\r\n    padding: 2px 0px 0px 4px;\r\n    font-size: 0.9em;\r\n    color: inherit;\r\n}\r\n\r\n.md-tag {\r\n    color: #a7a7a7;\r\n    opacity: 1;\r\n}\r\n\r\n.md-toc { \r\n    margin-top:20px;\r\n    padding-bottom:20px;\r\n}\r\n\r\n.sidebar-tabs {\r\n    border-bottom: none;\r\n}\r\n\r\n#typora-quick-open {\r\n    border: 1px solid #ddd;\r\n    background-color: #f8f8f8;\r\n}\r\n\r\n#typora-quick-open-item {\r\n    background-color: #FAFAFA;\r\n    border-color: #FEFEFE #e5e5e5 #e5e5e5 #eee;\r\n    border-style: solid;\r\n    border-width: 1px;\r\n}\r\n\r\n/** focus mode */\r\n.on-focus-mode blockquote {\r\n    border-left-color: rgba(85, 85, 85, 0.12);\r\n}\r\n\r\nheader, .context-menu, .megamenu-content, footer{\r\n    font-family: \"Segoe UI\", \"Arial\", sans-serif;\r\n}\r\n\r\n.file-node-content:hover .file-node-icon,\r\n.file-node-content:hover .file-node-open-state{\r\n    visibility: visible;\r\n}\r\n\r\n.mac-seamless-mode #typora-sidebar {\r\n    background-color: #fafafa;\r\n    background-color: var(--side-bar-bg-color);\r\n}\r\n\r\n.md-lang {\r\n    color: #b4654d;\r\n}\r\n\r\n/*.html-for-mac {\r\n    --item-hover-bg-color: #E6F0FE;\r\n}*/\r\n\r\n#md-notification .btn {\r\n    border: 0;\r\n}\r\n\r\n.dropdown-menu .divider {\r\n    border-color: #e5e5e5;\r\n    opacity: 0.4;\r\n}\r\n\r\n.ty-preferences .window-content {\r\n    background-color: #fafafa;\r\n}\r\n\r\n.ty-preferences .nav-group-item.active {\r\n    color: white;\r\n    background: #999;\r\n}\r\n\r\n.menu-item-container a.menu-style-btn {\r\n    background-color: #f5f8fa;\r\n    background-image: linear-gradient( 180deg , hsla(0, 0%, 100%, 0.8), hsla(0, 0%, 100%, 0)); \r\n}\r\n\n\n :root {--mermaid-font-zoom:1.5em ;} \n\u003c/style\u003e\u003ctitle\u003eREADME\u003c/title\u003e\n\u003c/head\u003e\n\u003cbody class='typora-export os-windows'\u003e\u003cdiv class='typora-export-content'\u003e\n\u003cdiv id='write'  class=''\u003e\u003cp\u003e\u003ca href='https://www.gnu.org/software/bash/'\u003e\u003cimg src=\"https://img.shields.io/badge/Made%20with-Bash-blue.svg\" referrerpolicy=\"no-referrer\" alt=\"made-with-bash\"\u003e\u003c/a\u003e\u003cspan\u003e \u003c/span\u003e\u003cimg src=\"https://img.shields.io/badge/TL;DR-shell functions to build a basic http server-blue.svg\" referrerpolicy=\"no-referrer\" alt=\"Generic badge\"\u003e\u003c/p\u003e\u003ch1 id='sertain---server-side-toolchain'\u003e\u003cspan\u003eSERTAIN - SERver-side ToolchAIN\u003c/span\u003e\u003c/h1\u003e\u003cp\u003e\u003cspan\u003eThis is just a silly project aimed towards quick prototyping and educational purposes. The idea is to enable anyone with only a little familarity with Bash and no knowledge of traditional server-side programming languages such as JS, Go, Python etc., quickly and easily setup a basic rate-limited API or http/1.1 server. Everything is pretty basic. The rate_limiter, for example, simply limits to 1 request per n seconds where n is provided by you.\u003c/span\u003e\u003c/p\u003e\u003cp\u003e\u003cspan\u003eThe main components are bundled inside the \u003c/span\u003e\u003ccode\u003esrc/\u003c/code\u003e\u003cspan\u003e directory. The \u003c/span\u003e\u003ccode\u003eetc/\u003c/code\u003e\u003cspan\u003e directory contains some essential statically-linked and hence portable binaries of programs that may or may not be needed for your purposes. \u003c/span\u003e\u003ccode\u003eexamples/\u003c/code\u003e\u003cspan\u003e contains handler script(s) for demo and testing. Use these with \u003c/span\u003e\u003ccode\u003esrc/server\u003c/code\u003e\u003cspan\u003e - see \u003c/span\u003e\u003ca href='#demo'\u003e\u003cspan\u003edemo\u003c/span\u003e\u003c/a\u003e\u003cspan\u003e below.\u003c/span\u003e\u003c/p\u003e\u003cp\u003e\u003cspan\u003eEverything is self-documented. If anything is still unclear, \u003c/span\u003e\u003ca href='mailto:dey.somajit@gmail.com'\u003e\u003cspan\u003ewrite to me\u003c/span\u003e\u003c/a\u003e\u003cspan\u003e.\u003c/span\u003e\u003c/p\u003e\u003ch4 id='demo'\u003e\u003cspan\u003eDemo:\u003c/span\u003e\u003c/h4\u003e\u003cp\u003e\u003cspan\u003eA simple echo server\u003c/span\u003e\u003c/p\u003e\u003col start='' \u003e\u003cli\u003e\u003ccode\u003ecd\u003c/code\u003e\u003cspan\u003e to project directory\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003ccode\u003esrc/server -p 8080 -s 6 \u0026#39;examples/echo_handler\u0026#39;\u003c/code\u003e\u003c/li\u003e\u003cli\u003e\u003cspan\u003eTest it with: \u003c/span\u003e\u003ccode\u003ecurl localhost:8080\u003c/code\u003e\u003cspan\u003e or by opening \u003c/span\u003e\u003ca href='http://localhost:8080' target='_blank' class='url'\u003ehttp://localhost:8080\u003c/a\u003e\u003cspan\u003e in a browser.\u003c/span\u003e\u003c/li\u003e\u003c/ol\u003e\u003cp\u003e\u0026nbsp;\u003c/p\u003e\u003c/div\u003e\u003c/div\u003e\n\u003c/body\u003e\n\u003c/html\u003e","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsomajitdey%2Fsertain","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsomajitdey%2Fsertain","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsomajitdey%2Fsertain/lists"}