@@ -1189,28 +1189,7 @@ static bool _reply(socketpool_socket_obj_t *socket, _request *request) {
11891189 _decode_percents (request -> path );
11901190
11911191 char * path = request -> path + 3 ;
1192- const char * path_out = NULL ;
11931192 size_t pathlen = strlen (path );
1194-
1195- mp_vfs_mount_t * vfs = mp_vfs_lookup_path (path , & path_out );
1196- if (vfs == MP_VFS_NONE ) {
1197- _reply_missing (socket , request );
1198- return false;
1199- }
1200- fs_user_mount_t * fs_mount ;
1201- if (vfs == MP_VFS_ROOT ) {
1202- fs_mount = filesystem_circuitpy ();
1203- } else {
1204- fs_mount = MP_OBJ_TO_PTR (vfs -> obj );
1205- // Skip non-fat and non-native block file systems.
1206- if (!filesystem_native_fatfs (fs_mount )) {
1207- _reply_missing (socket , request );
1208- return false;
1209- }
1210- path += strlen (vfs -> str );
1211- pathlen = strlen (path );
1212- }
1213- FATFS * fs = & fs_mount -> fatfs ;
12141193 // Trailing / is a directory.
12151194 bool directory = false;
12161195 if (path [pathlen - 1 ] == '/' ) {
@@ -1220,18 +1199,24 @@ static bool _reply(socketpool_socket_obj_t *socket, _request *request) {
12201199 }
12211200 directory = true;
12221201 }
1202+
1203+ // These manipulations work on the full path so do them first.
1204+
12231205 // Delete is almost identical for files and directories so share the
12241206 // implementation.
12251207 if (strcasecmp (request -> method , "DELETE" ) == 0 ) {
12261208 FRESULT result = supervisor_workflow_delete_recursive (path );
1227- if (result == FR_NO_PATH || result == FR_NO_FILE ) {
1209+ if (result == FR_WRITE_PROTECTED ) {
1210+ _reply_conflict (socket , request );
1211+ } else if (result == FR_NO_PATH || result == FR_NO_FILE ) {
12281212 _reply_missing (socket , request );
12291213 } else if (result != FR_OK ) {
12301214 _reply_server_error (socket , request );
12311215 } else {
12321216 _reply_no_content (socket , request );
12331217 return true;
12341218 }
1219+ return false;
12351220 } else if (strcasecmp (request -> method , "MOVE" ) == 0 ) {
12361221 _decode_percents (request -> destination );
12371222 char * destination = request -> destination + 3 ;
@@ -1253,7 +1238,51 @@ static bool _reply(socketpool_socket_obj_t *socket, _request *request) {
12531238 _reply_created (socket , request );
12541239 return true;
12551240 }
1256- } else if (directory ) {
1241+ return false;
1242+ } else if (directory && strcasecmp (request -> method , "PUT" ) == 0 ) {
1243+ DWORD fattime = 0 ;
1244+ if (request -> timestamp_ms > 0 ) {
1245+ truncate_time (request -> timestamp_ms * 1000000 , & fattime );
1246+ }
1247+ FRESULT result = supervisor_workflow_mkdir_parents (fattime , path );
1248+ if (result == FR_WRITE_PROTECTED ) {
1249+ _reply_conflict (socket , request );
1250+ } else if (result == FR_EXIST ) {
1251+ _reply_no_content (socket , request );
1252+ } else if (result == FR_NO_PATH ) {
1253+ _reply_missing (socket , request );
1254+ } else if (result != FR_OK ) {
1255+ _reply_server_error (socket , request );
1256+ } else {
1257+ _reply_created (socket , request );
1258+ return true;
1259+ }
1260+ return false;
1261+ }
1262+
1263+ // These responses don't use helpers because they stream data in and
1264+ // out. So, share the mount lookup code.
1265+ const char * path_out = NULL ;
1266+ mp_vfs_mount_t * vfs = mp_vfs_lookup_path (path , & path_out );
1267+ if (vfs == MP_VFS_NONE ) {
1268+ _reply_missing (socket , request );
1269+ return false;
1270+ }
1271+ fs_user_mount_t * fs_mount ;
1272+ if (vfs == MP_VFS_ROOT ) {
1273+ fs_mount = filesystem_circuitpy ();
1274+ } else {
1275+ fs_mount = MP_OBJ_TO_PTR (vfs -> obj );
1276+ // Skip non-fat and non-native block file systems.
1277+ if (!filesystem_native_fatfs (fs_mount )) {
1278+ _reply_missing (socket , request );
1279+ return false;
1280+ }
1281+ path += strlen (vfs -> str );
1282+ pathlen = strlen (path );
1283+ }
1284+ FATFS * fs = & fs_mount -> fatfs ;
1285+ if (directory ) {
12571286 if (strcasecmp (request -> method , "GET" ) == 0 ) {
12581287 FF_DIR dir ;
12591288 FRESULT res = f_opendir (fs , & dir , path );
@@ -1274,24 +1303,6 @@ static bool _reply(socketpool_socket_obj_t *socket, _request *request) {
12741303 }
12751304
12761305 f_closedir (& dir );
1277- } else if (strcasecmp (request -> method , "PUT" ) == 0 ) {
1278- DWORD fattime = 0 ;
1279- if (request -> timestamp_ms > 0 ) {
1280- truncate_time (request -> timestamp_ms * 1000000 , & fattime );
1281- }
1282- FRESULT result = supervisor_workflow_mkdir_parents (fattime , path );
1283- if (result == FR_WRITE_PROTECTED ) {
1284- _reply_conflict (socket , request );
1285- } else if (result == FR_EXIST ) {
1286- _reply_no_content (socket , request );
1287- } else if (result == FR_NO_PATH ) {
1288- _reply_missing (socket , request );
1289- } else if (result != FR_OK ) {
1290- _reply_server_error (socket , request );
1291- } else {
1292- _reply_created (socket , request );
1293- return true;
1294- }
12951306 }
12961307 } else { // Dealing with a file.
12971308 if (strcasecmp (request -> method , "GET" ) == 0 ) {
0 commit comments