aboutsummaryrefslogtreecommitdiffstats
path: root/doc-src/scripting/libmproxy.html
blob: db58f7e0068aafb5a5ee6c5bd726f5fcbea4e780 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<div class="well">
    <strong>Heads up!</strong> We strongly encourage you to use <a href="@!urlTo("scripting/inlinescripts.html")!@">inline scripts</a> rather than libmproxy
    directly.<br><br>
    <ul>
        <li>Inline Scripts are equally powerful and provide an easier syntax.</li>
        <li>Most examples are written as inline scripts.</li>
        <li>Multiple inline scripts can be combined and used together.</li>
        <li>Inline Scripts can either be executed headless with mitmdump or within the mitmproxy UI.</li>
    </ul>
</div>

All of mitmproxy's basic functionality is exposed through the __libmproxy__
library. The example below shows a simple implementation of the "sticky cookie"
functionality included in the interactive mitmproxy program. Traffic is
monitored for __cookie__ and __set-cookie__ headers, and requests are rewritten
to include a previously seen cookie if they don't already have one. In effect,
this lets you log in to a site using your browser, and then make subsequent
requests using a tool like __curl__, which will then seem to be part of the
authenticated session.

$!example("examples/stickycookies")!$
n class="n">argv) { FILE *f1, *f2; bool eof1, eof2; int i; check(argc == 3); f1 = fopen(argv[1], "r"); f2 = fopen(argv[2], "r"); check(f1 && f2); while (!feof(f1) && !feof(f2)) { line++; buffer1[0] = 0; buffer2[0] = 0; eof1 = fgets(buffer1, 1024, f1) == NULL; eof2 = fgets(buffer2, 1024, f2) == NULL; if (*buffer1 && buffer1[strlen(buffer1)-1] == '\n') buffer1[strlen(buffer1)-1] = 0; if (*buffer2 && buffer2[strlen(buffer2)-1] == '\n') buffer2[strlen(buffer2)-1] = 0; check(eof1 == eof2); for (i = 0; buffer1[i] || buffer2[i]; i++) { check(buffer1[i] != 0 && buffer2[i] != 0); // first argument is the reference. An 'z' or 'x' // here means we don't care about the result. if (buffer1[i] == 'z' || buffer1[i] == 'x') continue; check(buffer1[i] == buffer2[i]); } } check(feof(f1) && feof(f2)); fclose(f1); fclose(f2); return 0; }