[GH-ISSUE #1218] Map Remote for WebSocket requests? #1213

Open
opened 2026-03-03 19:49:20 +03:00 by kerem · 22 comments
Owner

Originally created by @JasonBoy on GitHub (May 1, 2022).
Original GitHub issue: https://github.com/ProxymanApp/Proxyman/issues/1218

Originally assigned to: @NghiaTranUIT on GitHub.

Not sure if this is supported, looks not when I try:
ws://a.com -> ws://localhost:8000, on which the Status column show "Internal Error",

so am i doing the right thing, or It should be a Feature request

Originally created by @JasonBoy on GitHub (May 1, 2022). Original GitHub issue: https://github.com/ProxymanApp/Proxyman/issues/1218 Originally assigned to: @NghiaTranUIT on GitHub. Not sure if this is supported, looks not when I try: `ws://a.com` -> `ws://localhost:8000`, on which the Status column show "Internal Error", so am i doing the right thing, or It should be a Feature request
Author
Owner

@NghiaTranUIT commented on GitHub (May 1, 2022):

Unfortunately, Map Remote or any debugging proxy doesn't support WebSocket yet. I'm planing to support it soon 👍

<!-- gh-comment-id:1114160768 --> @NghiaTranUIT commented on GitHub (May 1, 2022): Unfortunately, Map Remote or any debugging proxy doesn't support WebSocket yet. I'm planing to support it soon 👍
Author
Owner

@JasonBoy commented on GitHub (May 1, 2022):

thanks for the quick reply, it will be great if proxyman supports it in some of my cases 😃

<!-- gh-comment-id:1114161087 --> @JasonBoy commented on GitHub (May 1, 2022): thanks for the quick reply, it will be great if proxyman supports it in some of my cases 😃
Author
Owner

@raxityo commented on GitHub (Jan 19, 2023):

Hi @NghiaTranUIT, eagerly waiting for this. The only reason why I have to keep CharlesProxy running in parallel. 😅
Do you have any other alternative suggestions in the meantime?

<!-- gh-comment-id:1397498238 --> @raxityo commented on GitHub (Jan 19, 2023): Hi @NghiaTranUIT, eagerly waiting for this. The only reason why I have to keep CharlesProxy running in parallel. 😅 Do you have any other alternative suggestions in the meantime?
Author
Owner

@NghiaTranUIT commented on GitHub (Jan 20, 2023):

I can do a quick implementation for this feature. @raxityo do you use WS or WSS ?

<!-- gh-comment-id:1397865422 --> @NghiaTranUIT commented on GitHub (Jan 20, 2023): I can do a quick implementation for this feature. @raxityo do you use WS or WSS ?
Author
Owner

@raxityo commented on GitHub (Jan 20, 2023):

Wow, that would be amazing!
I use both: WSS for production & WS localhost mapped to production. 😊

<!-- gh-comment-id:1397903893 --> @raxityo commented on GitHub (Jan 20, 2023): Wow, that would be amazing! I use both: WSS for production & WS localhost mapped to production. 😊
Author
Owner

@bt commented on GitHub (Feb 14, 2023):

Hey @NghiaTranUIT can I check the status of this feature? I'm also looking for Map Remote for WSS.

I used to use Charles, but have just recently moved to Proxyman, but disappointed to find out I can't map WSS to localhost for debugging purposes. Am back to Charles temporarily but would highly rather use Proxyman!

<!-- gh-comment-id:1429100019 --> @bt commented on GitHub (Feb 14, 2023): Hey @NghiaTranUIT can I check the status of this feature? I'm also looking for Map Remote for WSS. I used to use Charles, but have just recently moved to Proxyman, but disappointed to find out I can't map WSS to localhost for debugging purposes. Am back to Charles temporarily but would highly rather use Proxyman!
Author
Owner

@NghiaTranUIT commented on GitHub (Feb 14, 2023):

Hey @bt. Sorry for the delay. I know the Map Remote for WS is essential. I'm working on it now 👍

<!-- gh-comment-id:1429160267 --> @NghiaTranUIT commented on GitHub (Feb 14, 2023): Hey @bt. Sorry for the delay. I know the Map Remote for WS is essential. I'm working on it now 👍
Author
Owner

@NghiaTranUIT commented on GitHub (Feb 15, 2023):

Just a friendly tag: @raxityo @bt @JasonBoy @helsonxiao @caojunkai01

Map Remote is working with WebSocket 👍

What's new:

How to config the Map Remote

Screenshot

WS Localhost to Production

localhost to production

WSS Production to Localhost

production to localhost

Result

Proxyman Map Remote for Websocketx

<!-- gh-comment-id:1430699706 --> @NghiaTranUIT commented on GitHub (Feb 15, 2023): Just a friendly tag: @raxityo @bt @JasonBoy @helsonxiao @caojunkai01 Map Remote is working with WebSocket 👍 ### What's new: - Support Map Websocket from Localhost to Production and vice versa. - Beta Download: https://download.proxyman.io/beta/Proxyman_4.2.1_Map_Remote_for_WS_and_WSS.dmg ### How to config the Map Remote - https://docs.proxyman.io/advanced-features/map-remote#7.4-map-websocket-from-localhost-to-production ### Screenshot #### WS Localhost to Production <img width="1648" alt="localhost to production" src="https://user-images.githubusercontent.com/5878421/218919847-294d5b82-01c5-47ba-b245-540dc96899e5.png"> #### WSS Production to Localhost <img width="1234" alt="production to localhost" src="https://user-images.githubusercontent.com/5878421/218919917-f7d8ce65-a59c-46ba-b498-b1bb4b68c0d0.png"> #### Result ![Proxyman Map Remote for Websocketx](https://user-images.githubusercontent.com/5878421/218919975-ad580fc5-9215-432b-89e0-c1c8f997c011.jpg)
Author
Owner

@bt commented on GitHub (Feb 15, 2023):

Wow! That was quick!

I will test this right now and give some feedback. Thank you!

<!-- gh-comment-id:1430716937 --> @bt commented on GitHub (Feb 15, 2023): Wow! That was quick! I will test this right now and give some feedback. Thank you!
Author
Owner

@helsonxiao commented on GitHub (Feb 15, 2023):

It's working with WebSocket now! Thanks!
If Map Remote can keep some query params unchanged, then I'll not use Charles anymore.
image

<!-- gh-comment-id:1430736951 --> @helsonxiao commented on GitHub (Feb 15, 2023): It's working with WebSocket now! Thanks! If Map Remote can keep some query params unchanged, then I'll not use Charles anymore. ![image](https://user-images.githubusercontent.com/26411634/218928250-c9589aa2-d28b-4703-be26-96eb6631c85e.png)
Author
Owner

@bt commented on GitHub (Feb 15, 2023):

@NghiaTranUIT so far so good on initial usage, however, it seems like I just received my first crash.

-------------------------------------
Translated Report (Full Report Below)
-------------------------------------

Process:               Proxyman [86483]
Path:                  /Applications/Proxyman.app/Contents/MacOS/Proxyman
Identifier:            com.proxyman.NSProxy
Version:               4.2.1 (42010)
Code Type:             X86-64 (Native)
Parent Process:        launchd [1]
User ID:               501

OS Version:            macOS 13.1 (22C65)
Report Version:        12
Anonymous UUID:        6DB7B6AA-0712-0EB0-7AFC-C4EE0DDB930C


Time Awake Since Boot: 19000 seconds

System Integrity Protection: enabled

Crashed Thread:        16  NIO-ELT-0-#15

Exception Type:        EXC_BAD_INSTRUCTION (SIGILL)
Exception Codes:       0x0000000000000001, 0x0000000000000000

Termination Reason:    Namespace SIGNAL, Code 4 Illegal instruction: 4
Terminating Process:   exc handler [86483]

Thread 0::  Dispatch queue: com.apple.main-thread
0   CoreFoundation                	    0x7ff802e052ea -[__NSDictionaryI objectForKey:] + 90
1   CoreUI                        	    0x7ff80ac79056 CUIRenderer::DecodeToCUIInfo(CGRect, CGContext*, __CFDictionary const*, CUIInfo*) const + 1248
2   CoreUI                        	    0x7ff80ac78a63 CUIRenderer::CopyMeasurements(CGRect, CGContext*, __CFDictionary const*, __CFArray const*) + 183
3   CoreUI                        	    0x7ff80ac78974 CUICopyMeasurements + 166
4   AppKit                        	    0x7ff805fbcc0e __72-[NSAppearance _copyMeasurements:context:options:requestedMeasurements:]_block_invoke + 61
5   AppKit                        	    0x7ff805f846bb -[NSCompositeAppearance _callCoreUIWithBlock:options:requireBezelTintColor:] + 386
6   AppKit                        	    0x7ff805fbcb93 -[NSAppearance _copyMeasurements:context:options:requestedMeasurements:] + 160
7   AppKit                        	    0x7ff805fbc8df NSVisualEffectViewGetMetadataValue + 169
8   AppKit                        	    0x7ff806717203 +[NSVisualEffectView _representativeColorForMaterial:isActive:] + 116
9   AppKit                        	    0x7ff8062c1c58 -[NSTableHeaderView drawRect:] + 120
10  AppKit                        	    0x7ff8060c92d4 _NSViewDrawRect + 121
11  AppKit                        	    0x7ff8068ae743 -[NSView _recursive:displayRectIgnoringOpacity:inContext:stopAtLayerBackedViews:] + 1810
12  AppKit                        	    0x7ff8060c8a00 -[NSView(NSLayerKitGlue) _drawViewBackingLayer:inContext:drawingHandler:] + 753
13  QuartzCore                    	    0x7ff80a8f5109 CABackingStoreUpdate_ + 254
14  QuartzCore                    	    0x7ff80a9588f1 invocation function for block in CA::Layer::display_() + 53
15  QuartzCore                    	    0x7ff80a8f4316 -[CALayer _display] + 2275
16  AppKit                        	    0x7ff8060c8655 -[_NSBackingLayer display] + 462
17  AppKit                        	    0x7ff8060407ed -[_NSViewBackingLayer display] + 554
18  QuartzCore                    	    0x7ff80a8f32c8 CA::Layer::display_if_needed(CA::Transaction*) + 900
19  QuartzCore                    	    0x7ff80aa6c8da CA::Context::commit_transaction(CA::Transaction*, double, double*) + 648
20  QuartzCore                    	    0x7ff80a8d4119 CA::Transaction::commit() + 725
21  AppKit                        	    0x7ff8060d9adf __62+[CATransaction(NSCATransaction) NS_setFlushesWithDisplayLink]_block_invoke + 285
22  AppKit                        	    0x7ff8068f19df ___NSRunLoopObserverCreateWithHandler_block_invoke + 41
23  CoreFoundation                	    0x7ff802e300b2 __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 23
24  CoreFoundation                	    0x7ff802e2ffda __CFRunLoopDoObservers + 482
25  CoreFoundation                	    0x7ff802e2f560 __CFRunLoopRun + 870
26  CoreFoundation                	    0x7ff802e2eb80 CFRunLoopRunSpecific + 560
27  HIToolbox                     	    0x7ff80c773766 RunCurrentEventLoopInMode + 292
28  HIToolbox                     	    0x7ff80c773576 ReceiveNextEventCommon + 679
29  HIToolbox                     	    0x7ff80c7732b3 _BlockUntilNextEventMatchingListInModeWithFilter + 70
30  AppKit                        	    0x7ff805f7af33 _DPSNextEvent + 909
31  AppKit                        	    0x7ff805f79db4 -[NSApplication(NSEvent) _nextEventMatchingEventMask:untilDate:inMode:dequeue:] + 1219
32  AppKit                        	    0x7ff805f6c3f7 -[NSApplication run] + 586
33  AppKit                        	    0x7ff805f40427 NSApplicationMain + 817
34  Proxyman                      	       0x109a2e719 0x109a22000 + 50969
35  dyld                          	    0x7ff802a22310 start + 2432
<!-- gh-comment-id:1430740272 --> @bt commented on GitHub (Feb 15, 2023): @NghiaTranUIT so far so good on initial usage, however, it seems like I just received my first crash. ``` ------------------------------------- Translated Report (Full Report Below) ------------------------------------- Process: Proxyman [86483] Path: /Applications/Proxyman.app/Contents/MacOS/Proxyman Identifier: com.proxyman.NSProxy Version: 4.2.1 (42010) Code Type: X86-64 (Native) Parent Process: launchd [1] User ID: 501 OS Version: macOS 13.1 (22C65) Report Version: 12 Anonymous UUID: 6DB7B6AA-0712-0EB0-7AFC-C4EE0DDB930C Time Awake Since Boot: 19000 seconds System Integrity Protection: enabled Crashed Thread: 16 NIO-ELT-0-#15 Exception Type: EXC_BAD_INSTRUCTION (SIGILL) Exception Codes: 0x0000000000000001, 0x0000000000000000 Termination Reason: Namespace SIGNAL, Code 4 Illegal instruction: 4 Terminating Process: exc handler [86483] Thread 0:: Dispatch queue: com.apple.main-thread 0 CoreFoundation 0x7ff802e052ea -[__NSDictionaryI objectForKey:] + 90 1 CoreUI 0x7ff80ac79056 CUIRenderer::DecodeToCUIInfo(CGRect, CGContext*, __CFDictionary const*, CUIInfo*) const + 1248 2 CoreUI 0x7ff80ac78a63 CUIRenderer::CopyMeasurements(CGRect, CGContext*, __CFDictionary const*, __CFArray const*) + 183 3 CoreUI 0x7ff80ac78974 CUICopyMeasurements + 166 4 AppKit 0x7ff805fbcc0e __72-[NSAppearance _copyMeasurements:context:options:requestedMeasurements:]_block_invoke + 61 5 AppKit 0x7ff805f846bb -[NSCompositeAppearance _callCoreUIWithBlock:options:requireBezelTintColor:] + 386 6 AppKit 0x7ff805fbcb93 -[NSAppearance _copyMeasurements:context:options:requestedMeasurements:] + 160 7 AppKit 0x7ff805fbc8df NSVisualEffectViewGetMetadataValue + 169 8 AppKit 0x7ff806717203 +[NSVisualEffectView _representativeColorForMaterial:isActive:] + 116 9 AppKit 0x7ff8062c1c58 -[NSTableHeaderView drawRect:] + 120 10 AppKit 0x7ff8060c92d4 _NSViewDrawRect + 121 11 AppKit 0x7ff8068ae743 -[NSView _recursive:displayRectIgnoringOpacity:inContext:stopAtLayerBackedViews:] + 1810 12 AppKit 0x7ff8060c8a00 -[NSView(NSLayerKitGlue) _drawViewBackingLayer:inContext:drawingHandler:] + 753 13 QuartzCore 0x7ff80a8f5109 CABackingStoreUpdate_ + 254 14 QuartzCore 0x7ff80a9588f1 invocation function for block in CA::Layer::display_() + 53 15 QuartzCore 0x7ff80a8f4316 -[CALayer _display] + 2275 16 AppKit 0x7ff8060c8655 -[_NSBackingLayer display] + 462 17 AppKit 0x7ff8060407ed -[_NSViewBackingLayer display] + 554 18 QuartzCore 0x7ff80a8f32c8 CA::Layer::display_if_needed(CA::Transaction*) + 900 19 QuartzCore 0x7ff80aa6c8da CA::Context::commit_transaction(CA::Transaction*, double, double*) + 648 20 QuartzCore 0x7ff80a8d4119 CA::Transaction::commit() + 725 21 AppKit 0x7ff8060d9adf __62+[CATransaction(NSCATransaction) NS_setFlushesWithDisplayLink]_block_invoke + 285 22 AppKit 0x7ff8068f19df ___NSRunLoopObserverCreateWithHandler_block_invoke + 41 23 CoreFoundation 0x7ff802e300b2 __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 23 24 CoreFoundation 0x7ff802e2ffda __CFRunLoopDoObservers + 482 25 CoreFoundation 0x7ff802e2f560 __CFRunLoopRun + 870 26 CoreFoundation 0x7ff802e2eb80 CFRunLoopRunSpecific + 560 27 HIToolbox 0x7ff80c773766 RunCurrentEventLoopInMode + 292 28 HIToolbox 0x7ff80c773576 ReceiveNextEventCommon + 679 29 HIToolbox 0x7ff80c7732b3 _BlockUntilNextEventMatchingListInModeWithFilter + 70 30 AppKit 0x7ff805f7af33 _DPSNextEvent + 909 31 AppKit 0x7ff805f79db4 -[NSApplication(NSEvent) _nextEventMatchingEventMask:untilDate:inMode:dequeue:] + 1219 32 AppKit 0x7ff805f6c3f7 -[NSApplication run] + 586 33 AppKit 0x7ff805f40427 NSApplicationMain + 817 34 Proxyman 0x109a2e719 0x109a22000 + 50969 35 dyld 0x7ff802a22310 start + 2432 ```
Author
Owner

@NghiaTranUIT commented on GitHub (Feb 15, 2023):

@bt can you try again? How % you can reproduce this crash 🤔

from what I see, the crash is from the internal AppKit.

<!-- gh-comment-id:1430740888 --> @NghiaTranUIT commented on GitHub (Feb 15, 2023): @bt can you try again? How % you can reproduce this crash 🤔 from what I see, the crash is from the internal AppKit.
Author
Owner

@NghiaTranUIT commented on GitHub (Feb 15, 2023):

It's working with WebSocket now! Thanks! If Map Remote can keep some query params unchanged, then I'll not use Charles anymore. image

Do you mean that the Query is changed? and it's a bug 🤔

From your screenshot, you define the Map to Query, so your Query's URL is always changed to room_id=..... -> It's a correct behavior.

<!-- gh-comment-id:1430742055 --> @NghiaTranUIT commented on GitHub (Feb 15, 2023): > It's working with WebSocket now! Thanks! If Map Remote can keep some query params unchanged, then I'll not use Charles anymore. ![image](https://user-images.githubusercontent.com/26411634/218928250-c9589aa2-d28b-4703-be26-96eb6631c85e.png) Do you mean that the Query is changed? and it's a bug 🤔 From your screenshot, you define the Map to Query, so your Query's URL is always changed to `room_id=.....` -> It's a correct behavior.
Author
Owner

@bt commented on GitHub (Feb 15, 2023):

I'll continue to use Proxyman as it's definitely better than having to run dual-proxy (Charles for WSS + Proxyman for everything else). I'll see if I notice any specific way to cause the crash.

<!-- gh-comment-id:1430742985 --> @bt commented on GitHub (Feb 15, 2023): > I'll continue to use Proxyman as it's definitely better than having to run dual-proxy (Charles for WSS + Proxyman for everything else). I'll see if I notice any specific way to cause the crash.
Author
Owner

@bt commented on GitHub (Feb 15, 2023):

I somehow managed to cause the crash again. So, it seems that if there's an active Proxyman WSS map to remote connection, and then the server disconnects (ie. as a developer, I make changes to the server code and the WS server reloads), then Proxyman will crash.

There's so many threads I'm not sure which one I should give you, but I've attached a crash log. Hopefully it will help!

crashlog.txt

<!-- gh-comment-id:1430746688 --> @bt commented on GitHub (Feb 15, 2023): I somehow managed to cause the crash again. So, it seems that if there's an active Proxyman WSS map to remote connection, and then the server disconnects (ie. as a developer, I make changes to the server code and the WS server reloads), then Proxyman will crash. There's so many threads I'm not sure which one I should give you, but I've attached a crash log. Hopefully it will help! [crashlog.txt](https://github.com/ProxymanApp/Proxyman/files/10739309/crashlog.txt)
Author
Owner

@NghiaTranUIT commented on GitHub (Feb 15, 2023):

Thanks @bt 🙇 I'm going to upload the dSYM file to decode your crash log. I suppose I can get somethings 👍

<!-- gh-comment-id:1430749610 --> @NghiaTranUIT commented on GitHub (Feb 15, 2023): Thanks @bt 🙇 I'm going to upload the dSYM file to decode your crash log. I suppose I can get somethings 👍
Author
Owner

@helsonxiao commented on GitHub (Feb 15, 2023):

It's working with WebSocket now! Thanks! If Map Remote can keep some query params unchanged, then I'll not use Charles anymore. image

Do you mean that the Query is changed? and it's a bug 🤔

From your screenshot, you define the Map to Query, so your Query's URL is always changed to room_id=..... -> It's a correct behavior.

I only want to add nocompression=1 in this rule, but it'll override all query params so I have to define the room_id=... for it. I think it's an expected behavior in this version so it's not a bug. Anyway, it's working now :)

<!-- gh-comment-id:1430771674 --> @helsonxiao commented on GitHub (Feb 15, 2023): > > It's working with WebSocket now! Thanks! If Map Remote can keep some query params unchanged, then I'll not use Charles anymore. ![image](https://user-images.githubusercontent.com/26411634/218928250-c9589aa2-d28b-4703-be26-96eb6631c85e.png) > > Do you mean that the Query is changed? and it's a bug 🤔 > > From your screenshot, you define the Map to Query, so your Query's URL is always changed to `room_id=.....` -> It's a correct behavior. I only want to add `nocompression=1` in this rule, but it'll override all query params so I have to define the `room_id=...` for it. I think it's an expected behavior in this version so it's not a bug. Anyway, it's working now :)
Author
Owner

@NghiaTranUIT commented on GitHub (Mar 12, 2023):

@bt I've fixed the crash that you've mentioned 👍

Basically, if you map the Websocket to invalid host/port by using the Map Remote, the old build would be crashed

You can try the Beta build here: https://github.com/ProxymanApp/Proxyman/issues/1573#issuecomment-1465078385

<!-- gh-comment-id:1465078603 --> @NghiaTranUIT commented on GitHub (Mar 12, 2023): @bt I've fixed the crash that you've mentioned 👍 Basically, if you map the Websocket to invalid host/port by using the Map Remote, the old build would be crashed ❌ You can try the Beta build here: https://github.com/ProxymanApp/Proxyman/issues/1573#issuecomment-1465078385
Author
Owner

@bt commented on GitHub (Mar 12, 2023):

@bt I've fixed the crash that you've mentioned 👍

Basically, if you map the Websocket to invalid host/port by using the Map Remote, the old build would be crashed

You can try the Beta build here: https://github.com/ProxymanApp/Proxyman/issues/1573#issuecomment-1465078385

Thanks, I've been put to work on another project for the next couple of days temporarily so I won't be able to try the beta.

When will this be out in release?

<!-- gh-comment-id:1465080032 --> @bt commented on GitHub (Mar 12, 2023): > @bt I've fixed the crash that you've mentioned 👍 > > > > Basically, if you map the Websocket to invalid host/port by using the Map Remote, the old build would be crashed ❌ > > > > You can try the Beta build here: https://github.com/ProxymanApp/Proxyman/issues/1573#issuecomment-1465078385 > > Thanks, I've been put to work on another project for the next couple of days temporarily so I won't be able to try the beta. When will this be out in release?
Author
Owner

@NghiaTranUIT commented on GitHub (Mar 12, 2023):

@bt It's released in the latest v4.4.0 15 mins ago 🎉

Don't worry to test it. I'm able to reproduce the crash and properly fix it 😄

<!-- gh-comment-id:1465083812 --> @NghiaTranUIT commented on GitHub (Mar 12, 2023): @bt It's released in the latest [v4.4.0](https://github.com/ProxymanApp/Proxyman/releases/tag/4.4.0) 15 mins ago 🎉 Don't worry to test it. I'm able to reproduce the crash and properly fix it 😄
Author
Owner

@JasonBoy commented on GitHub (Apr 3, 2023):

@NghiaTranUIT just curious, does this ws map feature works for Scriping tool? when i try the below, seems not work:
wss://www.a.com -> ws://127.0.0.1:8082

request.scheme = 'ws'
request.host = '127.0.0.1'
request.port = 8082
<!-- gh-comment-id:1494133951 --> @JasonBoy commented on GitHub (Apr 3, 2023): @NghiaTranUIT just curious, does this ws map feature works for `Scriping` tool? when i try the below, seems not work: `wss://www.a.com` -> `ws://127.0.0.1:8082` ``` request.scheme = 'ws' request.host = '127.0.0.1' request.port = 8082 ```
Author
Owner

@NghiaTranUIT commented on GitHub (Apr 3, 2023):

Sorry @JasonBoy, only Map Remote supports the WS/WSS. The Scripting hasn't supported yet 👍

<!-- gh-comment-id:1494237309 --> @NghiaTranUIT commented on GitHub (Apr 3, 2023): Sorry @JasonBoy, only Map Remote supports the WS/WSS. The Scripting hasn't supported yet 👍
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
starred/Proxyman#1213
No description provided.