Hacker News new | past | comments | ask | show | jobs | submit login
Making http clients for use with netcat-like programs, part 1 of 2
1 point by textmode on Aug 5, 2018 | hide | past | favorite
part 1 of 2

   # make config parser (yy018)
   # source code for 018.l is below
   flex -8iCrfa 018.l;
   cc -static -o yy018 lex.yy.c;

   # create a config (hh1)
   # format is name: "value" 
   # no indent, must be left-justified
   cat > hh1
   httpVersion="1.0"
   Host: ""
   Connection: "close"
   User-Agent: "CERN-LineMode/2.15 libwww/2.17b3"
   ^D
save as "018.l"

     #define jmp (yy_start) = 1 + 2 *
     #define se setenv
     #define g getenv
     #define X(x) fputs(x,stdout)
     #define Y(x,y) fprintf(stdout,x,y)
     #define Y2(x,y) fprintf(stderr,x,y)
     xxyy()
     {
      se("value",yytext,1);
      Y("\40\40\40if(0==se(\"%s\",",g("name"));
      Y("%s,0))",g("value"));
      Y("p(\"%s: %%s\\r\\n\",",g("name"));
      Y("g(\"%s\"));\n",g("name"));
     }
     int lineno=1;
    %s xa xb xc xd
    %%
    \n lineno++;
    ^[\40\11]+ { 
     Y2("yy018: error: remove %d ",yyleng);
     Y2("leading spaces/tabs from line %d\n",lineno);
     yyterminate();
     } 
    ^"Referer"[: ] jmp xb;
    ^"Host"[: ] se("name","Host",1);jmp xc;
    ^[^\40\11\":\n]* se("name",yytext,1);jmp xa;
    <xa>[\"][^\"]*[\"] { 
     if(yyleng>2)xxyy();
     else if(yyleng==2&&yytext[0]=='\"'&&yytext[1]=='\"') { 
     se("value",yytext,1);
     Y("\40\40\40if(g(\"%s\"))",g("name"));
     Y("p(\"%s: %%s\\r\\n\",",g("name"));
     Y("g(\"%s\"));\n",g("name"));
     }}
    <xc>[\"][^\"]*[\"] xxyy();
    <xb>[\"][^\":]*[\"] { 
     if(!g("Referer")){ 
     X("\40\40\40p(\"Referer: %s\",g(\"Scheme\"));");
     X("p(\"%s\",g(\"Host\"));");
     X("if(0==path)puts(\"\\r\");\n");
     X("if(1==path)p(\"%s\\r\\n\",g(\"Path\"));\n");
     }}
    \n|.
    %%
    int main(){ yylex();}
    int yywrap(){}



Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: