<div dir="ltr">I've just tested the proxy basic authentication but it doesn't seem to work.<div><br></div><div>The error from squid3 proxy's log is</div><div>"192.168.137.1 TCP_DENIED/407 3731 CONNECT <a href="http://192.168.137.1:443" target="_blank">192.168.137.1:443</a> %cc%cc%cc%cc%cc%cctest1 HIER_NONE/- text/html"<br></div><div><br></div><div>The user name is supposed to be test1, so there seem to be some bytes "%cc" preceding it (you can see that character at <a href="http://www.degraeve.com/reference/urlencoding.php" target="_blank">http://www.degraeve.com/reference/urlencoding.php</a>).</div><div><br></div><div>In using lws, I set the proxy in this string "<a href="http://test1:password@192.168.137.106:3128">test1:password@192.168.137.106:3128</a>". And I use wss.<br></div><div><br></div><div>I set up squid3's proxy basic authentication following this instruction <a href="http://stackoverflow.com/questions/3297196/how-to-set-up-a-squid-proxy-with-basic-username-and-password-authentication">http://stackoverflow.com/questions/3297196/how-to-set-up-a-squid-proxy-with-basic-username-and-password-authentication</a>, and it works using Chrome browser via the proxy and user name and password as above.</div><div><br></div><div>Thanks,</div><div>Lan</div><div><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Sat, Nov 7, 2015 at 6:28 PM, Andy Green <span dir="ltr"><<a href="mailto:andy@warmcat.com" target="_blank">andy@warmcat.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class=""><br>
<br>
On 8 November 2015 09:26:55 GMT+08:00, Andy Green <<a href="mailto:andy@warmcat.com">andy@warmcat.com</a>> wrote:<br>
><br>
><br>
>On 7 November 2015 14:46:49 GMT+08:00, Duy Lan Nguyen<br>
><<a href="mailto:ndlan2k@gmail.com">ndlan2k@gmail.com</a>> wrote:<br>
>>Awesome, mine is older than that.<br>
>><br>
>>It seems to me that lws has supported proxy, but not yet proxy<br>
>>authentication using user name and password. Do you plan to support<br>
>>that in<br>
>>a near future?<br>
><br>
>Depends what you mean... according to this<br>
><br>
><a href="https://wiki.archlinux.org/index.php/Proxy_settings" rel="noreferrer" target="_blank">https://wiki.archlinux.org/index.php/Proxy_settings</a><br>
><br>
>You can just stick your auth details behind the proxy url<br>
><br>
>echo -n "username: "; read username<br>
>if [[ $username != "" ]]; then<br>
>   echo -n "password: "<br>
>   read -es password<br>
>   local pre="$username:$password@"<br>
>fi<br>
><br>
>export http_proxy="http://$pre$server:$port/"<br>
>export https_proxy=$http_proxy<br>
>...<br>
><br>
>There are other kinds of proxy auth like http basic auth you can add in<br>
>user code.<br>
<br>
</span>I pushed a patch to support the user:pw@ syntax and send the header with a base64 version of it on proxy connect.  I tested the parsing but the header part is untested since no suitable proxy here.<br>
<br>
Please let me know how it goes.<br>
<br>
-Andy<br>
<div><div class="h5"><br>
>-Andy<br>
><br>
><br>
>>Thanks,<br>
>>Lan<br>
>><br>
>><br>
>>On Fri, Nov 6, 2015 at 3:40 PM, Andy Green <<a href="mailto:andy@warmcat.com">andy@warmcat.com</a>> wrote:<br>
>><br>
>>><br>
>>><br>
>>> On 6 November 2015 16:51:29 GMT+08:00, Duy Lan Nguyen<br>
>><<a href="mailto:ndlan2k@gmail.com">ndlan2k@gmail.com</a>><br>
>>> wrote:<br>
>>> >Sorry, it was due to referring to already freed memory, not double<br>
>>> >freeing.<br>
>>> >I can point to where it happens.<br>
>>> >At line 300,<br>
>>> ><br>
>>><br>
>><a href="http://git.libwebsockets.org/cgi-bin/cgit/libwebsockets/tree/lib/client-handshake.c#n300" rel="noreferrer" target="_blank">http://git.libwebsockets.org/cgi-bin/cgit/libwebsockets/tree/lib/client-handshake.c#n300</a><br>
>>> ,<br>
>>> >wsi is freed by lws_free(wsi) (in function<br>
>>> >libwebsocket_client_connect_2,<br>
>>> >called by lws_client_socket_service, called by<br>
>>libwebsocket_service_fd<br>
>>> ><=<br>
>>> >lws_plat_service <= libwebsocket_service).<br>
>>> >But that wsi memory is referred to again at<br>
>>> ><br>
>>><br>
>><a href="http://git.libwebsockets.org/cgi-bin/cgit/libwebsockets/tree/lib/lws-plat-win.c#n45" rel="noreferrer" target="_blank">http://git.libwebsockets.org/cgi-bin/cgit/libwebsockets/tree/lib/lws-plat-win.c#n45</a><br>
>>> >(in function wsi_from_fd, called by libwebsocket_context_destroy).<br>
>>> ><br>
>>> >Do you think it is the problem? I can fix it by assigning wsi=NULL<br>
>>> >after<br>
>>> >freeing and checking if wsi!=NULL before referring to its memory,<br>
>>then<br>
>>> >git-pushing the change. Is that ok?<br>
>>><br>
>>> No that has a slightly deeper cause, which is we errored out of<br>
>>client<br>
>>> connection init, but didn't take care to remove the connection from<br>
>>the fd<br>
>>> list on that path.  However that was fixed a while ago<br>
>>><br>
>>><br>
>>><br>
>><a href="http://git.libwebsockets.org/cgi-bin/cgit/libwebsockets/commit/?id=b5cf69fdb57c4025572cde1007e0ff16108d4f80" rel="noreferrer" target="_blank">http://git.libwebsockets.org/cgi-bin/cgit/libwebsockets/commit/?id=b5cf69fdb57c4025572cde1007e0ff16108d4f80</a><br>
>>><br>
>>> How old is your lws?<br>
>>><br>
>>> -Andy<br>
>>><br>
>>> >Besides, in the code as follows, I waited for the thread of<br>
>>> >libwebsocket_service loop to stop before calling<br>
>>> >libwebsocket_context_destroy(). So I think the crash may happen<br>
>even<br>
>>> >without threading.<br>
>>> >if (pVeraSocket)<br>
>>> >{<br>
>>> >if (pVeraSocket->m_hThreadService && pVeraContext &&<br>
>>> >pVeraContext->m_pVeraSocketInfo)<br>
>>> >{<br>
>>> >pVeraContext->m_pVeraSocketInfo->m_ConnInfo.m_fConnClosed = TRUE;<br>
>>> ><br>
>>> >WaitForSingleObject(pVeraSocket->m_hThreadService, INFINITE);<br>
>>> >CloseHandle(pVeraSocket->m_hThreadService);<br>
>>> >pVeraSocket->m_hThreadService = NULL;<br>
>>> >pVeraSocket->m_dwThreadServiceId = 0;<br>
>>> >}<br>
>>> >...<br>
>>> >}<br>
>>> ><br>
>>> >if (pVeraContext)<br>
>>> >                {<br>
>>> >s_rgppVeraSocketInfo[pVeraContext->m_nConnTicket] = NULL;<br>
>>> >    if (pVeraContext->m_pContext)<br>
>>> >{<br>
>>> >libwebsocket_context_destroy(pVeraContext->m_pContext);<br>
>>> >pVeraContext->m_pContext = NULL;<br>
>>> >}<br>
>>> >                }<br>
>>> ><br>
>>> >I have a further question. I was trying to develop based on the<br>
>>> >following<br>
>>> >description of libwebsocket_service() at<br>
>>> ><a href="https://libwebsockets.org/libwebsockets-api-doc.html" rel="noreferrer" target="_blank">https://libwebsockets.org/libwebsockets-api-doc.html</a>. If I don't<br>
>>> >interpret<br>
>>> >it incorrectly, it means I could create another thread for the<br>
>>> >libwebsocket_service() loop so that it doesn't block the main<br>
>>thread,<br>
>>> >which<br>
>>> >can do other stuff. So how should I interpret this description?<br>
>>> >"*int* *libwebsocket_service* (*struct libwebsocket_context **<br>
>>> >*context*,<br>
>>> >*int* *timeout_ms*)<br>
>>> >...Description<br>
>>> ><br>
>>> >This function deals with any pending websocket traffic, for three<br>
>>kinds<br>
>>> >of<br>
>>> >event. It handles these events on both server and client types of<br>
>>> >connection the same.<br>
>>> ><br>
>>> >1) Accept new connections to our context's server<br>
>>> ><br>
>>> >2) Call the receive callback for incoming frame data received by<br>
>>server<br>
>>> >or<br>
>>> >client connections.<br>
>>> ><br>
>>> >You need to call this service function periodically to all the<br>
>above<br>
>>> >functions to happen; if your application is single-threaded you can<br>
>>> >just<br>
>>> >call it in your main event loop.<br>
>>> ><br>
>>> >Alternatively you can fork a new process that asynchronously<br>
>handles<br>
>>> >calling this service in a loop. In that case you are happy if this<br>
>>call<br>
>>> >blocks your thread until it needs to take care of something and<br>
>>would<br>
>>> >call<br>
>>> >it with a large nonzero timeout. Your loop then takes no CPU while<br>
>>> >there is<br>
>>> >nothing happening.<br>
>>> ><br>
>>> >If you are calling it in a single-threaded app, you don't want it<br>
>to<br>
>>> >wait<br>
>>> >around blocking other things in your loop from happening, so you<br>
>>would<br>
>>> >call<br>
>>> >it with a timeout_ms of 0, so it returns immediately if nothing is<br>
>>> >pending,<br>
>>> >or as soon as it services whatever was pending."<br>
>>> ><br>
>>> >Thanks,<br>
>>> >Lan<br>
>>> ><br>
>>> ><br>
>>> ><br>
>>> >On Wed, Nov 4, 2015 at 7:16 PM, Andy Green <<a href="mailto:andy@warmcat.com">andy@warmcat.com</a>><br>
>wrote:<br>
>>> ><br>
>>> >><br>
>>> >><br>
>>> >> On 5 November 2015 09:52:11 GMT+08:00, Duy Lan Nguyen<br>
>>> ><<a href="mailto:ndlan2k@gmail.com">ndlan2k@gmail.com</a>><br>
>>> >> wrote:<br>
>>> >> >Hi Andy and Anyone-who-can-help,<br>
>>> >> ><br>
>>> >> >We have a situation of double freeing and crashing here and<br>
>>wonder<br>
>>> >if<br>
>>> >> >anyone can help.<br>
>>> >><br>
>>> >> Maybe someone else can help.<br>
>>> >><br>
>>> >> I don't have windows, and lws doesn't have threads.<br>
>>> >><br>
>>> >> If you can make a patch that does the minimum to lws-test-server<br>
>>to<br>
>>> >make<br>
>>> >> the problem come on Linux, I'll study it.  But the answer is<br>
>>likely<br>
>>> >in your<br>
>>> >> threading additions outside of lws.<br>
>>> >><br>
>>> >> -Andy<br>
>>> >><br>
>>> >> >We use lws as follows, with highlights<br>
>>> >> ><br>
>>> >> >We have a connection function VeraConnect that calls<br>
>>> >> >libwebsocket_create_context and libwebsocket_client_connect, and<br>
>>> >> >creates<br>
>>> >> >another thread PollService for the polling service<br>
>>> >> >libwebsocket_service. If<br>
>>> >> >VeraConnect fails, it will clean up by stopping the thread<br>
>>> >PollService<br>
>>> >> >and<br>
>>> >> >calling libwebsocket_context_destroy. The functions VeraConnect<br>
>>and<br>
>>> >> >PollService are summarized as below.<br>
>>> >> ><br>
>>> >> >...<br>
>>> >> >VeraConnect(...)<br>
>>> >> >{<br>
>>> >> >....<br>
>>> >> >  if (!pVeraContext->m_pContext)<br>
>>> >> >    {<br>
>>> >> >        pVeraContext->m_pContext = libwebsocket_create_context<br>
>>> >> >(pVeraContext->m_pInfo);<br>
>>> >> >        if (!pVeraContext->m_pContext) {<br>
>>> >> >            ret = VERA_FAIL;<br>
>>> >> >            goto exit;<br>
>>> >> >        }<br>
>>> >> >    }<br>
>>> >> ><br>
>>> >> >pVeraSocket->m_pWSI =<br>
>>> >> >libwebsocket_client_connect(pVeraContext->m_pContext,<br>
>>> >> >...);<br>
>>> >> ><br>
>>> >> >    if (!pVeraSocket->m_pWSI) {<br>
>>> >> >        ret = VERA_FAIL;<br>
>>> >> >        goto exit;<br>
>>> >> >    }<br>
>>> >> ><br>
>>> >> >  pVeraContext->m_pVeraSocketInfo->m_ConnInfo.m_fConnClosed =<br>
>>FALSE;<br>
>>> >> ><br>
>>> >> >  pVeraSocket->m_hThreadService = CreateThread(<br>
>>> >> >...<br>
>>> >> >        PollService,       // thread function name<br>
>>> >> >        pVeraContext,          // argument to thread function<br>
>>> >> >...);   // returns the thread identifier<br>
>>> >> ><br>
>>> >> >exit:<br>
>>> >> >  if (ret != VERA_OK)<br>
>>> >> >    {<br>
>>> >> >if (pVeraSocket)<br>
>>> >> >{<br>
>>> >> >if (pVeraSocket->m_hThreadService && pVeraContext &&<br>
>>> >> >pVeraContext->m_pVeraSocketInfo)<br>
>>> >> >{<br>
>>> >> >pVeraContext->m_pVeraSocketInfo->m_ConnInfo.m_fConnClosed =<br>
>TRUE;<br>
>>> >> ><br>
>>> >> >WaitForSingleObject(pVeraSocket->m_hThreadService, INFINITE);<br>
>>> >> >CloseHandle(pVeraSocket->m_hThreadService);<br>
>>> >> >pVeraSocket->m_hThreadService = NULL;<br>
>>> >> >pVeraSocket->m_dwThreadServiceId = 0;<br>
>>> >> >}<br>
>>> >> >...<br>
>>> >> >}<br>
>>> >> ><br>
>>> >> >if (pVeraContext)<br>
>>> >> >                {<br>
>>> >> >s_rgppVeraSocketInfo[pVeraContext->m_nConnTicket] = NULL;<br>
>>> >> >    if (pVeraContext->m_pContext)<br>
>>> >> >{<br>
>>> >> >libwebsocket_context_destroy(pVeraContext->m_pContext);<br>
>>> >> >pVeraContext->m_pContext = NULL;<br>
>>> >> >}<br>
>>> >> >                }<br>
>>> >> >...<br>
>>> >> >   }<br>
>>> >> >...<br>
>>> >> >}<br>
>>> >> >...<br>
>>> >> >... PollService(LPVOID lpParam)<br>
>>> >> >{<br>
>>> >> >        int n = 0;<br>
>>> >> >VeraContext *pVeraContext = (VeraContext *)lpParam;<br>
>>> >> ><br>
>>> >> >if (pVeraContext && pVeraContext->m_pVeraSocketInfo &&<br>
>>> >> >pVeraContext->m_pContext)<br>
>>> >> >{<br>
>>> >> >BOOL *pfSocketClosed =<br>
>>> >> >&pVeraContext->m_pVeraSocketInfo->m_ConnInfo.m_fConnClosed;<br>
>>> >> >struct libwebsocket_context *pContext =<br>
>pVeraContext->m_pContext;<br>
>>> >> ><br>
>>> >> >while (n >= 0 && !*pfSocketClosed) {<br>
>>> >> >n = libwebsocket_service(pContext, 64);<br>
>>> >> >}<br>
>>> >> >}<br>
>>> >> >        return 0;<br>
>>> >> >}<br>
>>> >> ><br>
>>> >> >Sometimes, our first VeraConnect call fails, then the immediate<br>
>>next<br>
>>> >> >VeraConnect call crashes. The crash details are below, with line<br>
>>> >> >numbers (e.g.<br>
>>> >> >one line below refers to calling wsi_from_fd() near line 310 of<br>
>>> >> >context.c<br>
>>> >> >in function libwebsocket_context_destroy()). Basically, the<br>
>>memory<br>
>>> >has<br>
>>> >> >been<br>
>>> >> >freed by libwebsocket_service below (its trace includes<br>
>>> >> >libwebsocket_service_fd, lws_client_socket_service,<br>
>>> >> >libwebsocket_client_connect_2, _realloc), but it is then freed<br>
>>again<br>
>>> >by<br>
>>> >> >the<br>
>>> >> >libwebsocket_context_destroy() inside VeraConnect. Therefore it<br>
>>> >> >crashes.<br>
>>> >> ><br>
>>> >> >So could anyone please tell me if my way of using lws should be<br>
>>> >changed<br>
>>> >> >to<br>
>>> >> >fix this? Or is there a way to change lws to avoid this crash?<br>
>>> >> ><br>
>>> >> >Many thanks,<br>
>>> >> >Lan<br>
>>> >> ><br>
>>> >> >original faulting stack:<br>
>>> >> ><br>
>>> >> >0:003> .ecxr<br>
>>> >> >rax=000000000477cee0 rbx=0000000013f70c50 rcx=0000000000000000<br>
>>> >> >rdx=000000000402d680 rsi=0000000000000000 rdi=0000000000000000<br>
>>> >> >rip=00000000ff3f159a rsp=000000000659f788 rbp=00000000ff406ba0<br>
>>> >> > r8=0000000000000004  r9=0000000013f70c50 r10=0000000000000280<br>
>>> >> >r11=0000000000000004 r12=0000000000000000 r13=0000000000000102<br>
>>> >> >r14=000000000659f880 r15=0000000004847ff8<br>
>>> >> >iopl=0         nv up ei pl nz na pe nc<br>
>>> >> >cs=0033  ss=002b  ds=002b  es=002b  fs=0053  gs=002b<br>
>>> >> >efl=00010202<br>
>>> >> >phantom!wsi_from_fd+0x3a:<br>
>>> >> >00000000`ff3f159a 44395060        cmp     dword ptr<br>
>>[rax+60h],r10d<br>
>>> >> >ds:00000000`0477cf40=????????<br>
>>> >> >0:003> kv<br>
>>> >> >  *** Stack trace for last set context - .thread/.cxr resets it<br>
>>> >> >Child-SP          RetAddr           : Args to<br>
>>> >> >Child<br>
>:<br>
>>> >Call<br>
>>> >> >Site<br>
>>> >> >00000000`0659f788 00000000`ff3efe1f : 00000000`00000000<br>
>>> >> >00000000`ff3a1c74<br>
>>> >> >00000000`ff3a1c78 00000000`03eade30 : phantom!wsi_from_fd+0x3a<br>
>>> >> >[c:\libwebsockets\lib\lws-plat-win.c @ 45]<br>
>>> >> >00000000`0659f790 00000000`ff3c2b7f : 00000000`00000102<br>
>>> >> >00000000`03eade30<br>
>>> >> >00000000`03eade20 00000000`04847fe0 :<br>
>>> >> >phantom!libwebsocket_context_destroy+0x5f<br>
>>> >> >[c:\libwebsockets\lib\context.c @ 310]<br>
>>> >> >00000000`0659f7d0 00000000`ff3bec11 : 00000000`0659f898<br>
>>> >> >00000000`02460000<br>
>>> >> >00000000`00000050 00000000`ff40e5f8 : phantom!VeraConnect+0x29f<br>
>>> >> >[c:\socketcode\c\verasock\verasocklws.c @ 1194]<br>
>>> >> >...<br>
>>> >> >00000000`0659ff10 00000000`76fa3281 : 00000000`00000000<br>
>>> >> >00000000`00000000<br>
>>> >> >00000000`00000000 00000000`00000000 :<br>
>>> >kernel32!BaseThreadInitThunk+0xd<br>
>>> >> >00000000`0659ff40 00000000`00000000 : 00000000`00000000<br>
>>> >> >00000000`00000000<br>
>>> >> >00000000`00000000 00000000`00000000 :<br>
>>ntdll!RtlUserThreadStart+0x1d<br>
>>> >> ><br>
>>> >> >0:003> !heap -p -a 000000000477cee0<br>
>>> >> >    address 000000000477cee0 found in<br>
>>> >> >    _DPH_HEAP_ROOT @ 3d51000<br>
>>> >> >    in free-ed allocation (  DPH_HEAP_BLOCK:         VirtAddr<br>
>>> >> >VirtSize)<br>
>>> >> >                                    3d549c0:          477c000<br>
>>> >> >2000<br>
>>> >> >*** ERROR: Symbol file could not be found.  Defaulted to export<br>
>>> >symbols<br>
>>> >> >for<br>
>>> >> >verifier.dll -<br>
>>> >> >    000007fef45b8726<br>
>>> >><br>
>>><br>
>>>>verifier!VerifierDisableFaultInjectionExclusionRange+0x000000000000234e<br>
>>> >> >    000000007703c415 ntdll!RtlDebugFreeHeap+0x0000000000000035<br>
>>> >> >    0000000076fdd0fe ntdll! ??<br>
>>> >::FNODOBFM::`string'+0x00000000000122e2<br>
>>> >> >    0000000076fc2075 ntdll!RtlFreeHeap+0x00000000000001a2<br>
>>> >> >*** ERROR: Symbol file could not be found.  Defaulted to export<br>
>>> >symbols<br>
>>> >> >for<br>
>>> >> >msvcrt.dll -<br>
>>> >> >    000007fefd4e10c4 msvcrt!free+0x000000000000001c<br>
>>> >> >    00000000ff3f2bac phantom!_realloc+0x000000000000001c<br>
>>> >> >[c:\libwebsockets\lib\alloc.c @ 9]<br>
>>> >> >00000000ff3f0e77<br>
>>> >> >phantom!libwebsocket_client_connect_2+0x00000000000003b7<br>
>>> >> >[c:\libwebsockets\lib\client-handshake.c @ 289]<br>
>>> >> >  00000000ff3f5385<br>
>>> >phantom!lws_client_socket_service+0x0000000000000045<br>
>>> >> >[c:\libwebsockets\lib\client.c @ 63]<br>
>>> >> >    00000000ff3f0a46<br>
>>> >phantom!libwebsocket_service_fd+0x00000000000003f6<br>
>>> >> >[c:\libwebsockets\lib\service.c @ 616]<br>
>>> >> >    00000000ff3f1909 phantom!lws_plat_service+0x0000000000000119<br>
>>> >> >[c:\libwebsockets\lib\lws-plat-win.c @ 164]<br>
>>> >> >    00000000ff3c1cf6 phantom!PollService+0x0000000000000036<br>
>>> >> >[c:\socketcode\c\verasock\verasocklws.c @ 377]<br>
>>> >> >    0000000076e6f56d<br>
>>kernel32!BaseThreadInitThunk+0x000000000000000d<br>
>>> >> >    0000000076fa3281 ntdll!RtlUserThreadStart+0x000000000000001d<br>
>>> >><br>
>>> >><br>
>>><br>
>>><br>
><br>
</div></div>>_______________________________________________<br>
>Libwebsockets mailing list<br>
><a href="mailto:Libwebsockets@ml.libwebsockets.org">Libwebsockets@ml.libwebsockets.org</a><br>
><a href="http://ml.libwebsockets.org/mailman/listinfo/libwebsockets" rel="noreferrer" target="_blank">http://ml.libwebsockets.org/mailman/listinfo/libwebsockets</a><br>
<br>
</blockquote></div><br></div>